2010-03-03 2 views
0

Я пишу сценарий, и в моем сценарии у меня есть эта функция:функция не определена, но на самом деле определяется

def insert_image(cursor, object_id, sku): 
    product_obj = core.Object.get(object_id) 
    string_sku = str(sku) 
    folder = string_sku[0] + string_sku[1] + string_sku[2] 
    found_url = False 
    # KLUDGE This is ugly and redundant, however putting this in an if elif elif else throws error when url not found 
    # try this url first 
    try urllib.urlopen("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku)): 
     urllib.URLopener().retrieve("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku), "%sPR-IT,PM.jpg" % (sku)) 
     found_url = True 
    except: 
     found_url = False 
    # If that one didn't work try this one 
    if found_url == False: 
     try urllib.urlopen("http://<path to images>/%s/%sPK-PT,PM.jpg" % (folder, sku)): 
      urllib.URLopener().retrieve("http://<path to images>/%s/%sPK-PT,PM.jpg" % (folder, sku), "%sPK-PT,PM.jpg" % (sku)) 
      found_url = True 
     except: 
      found_url = False 
    # If still nothing, one last attempt 
    if found_url == False: 
     try urllib.urlopen("http://<path to images>/%s/%sCC-PT,IM.jpg" % (folder, sku)): 
      urllib.URLopener().retrieve("http://<path to images>/%s/%sCC-PT,IM.jpg" % (folder, sku), "%sCC-PT,IM.jpg" % (sku)) 
      found_url = True 
     except: 
      found_url = False 
    # We failed to find an image for this product, it will have to be done manually 
    if found_url == False: 
     log.info("Could not find the image on notions") 
     return False 

    # Hey we found something! Open the image.... 
    send_image = open('%sPK-PT,PM.jpg' % sku, 'r') 
    # ...and send it for processing 
    if product_obj.set_image(send_image, 5, 1) == False: 
     return False 
    else: 
     log.debug("Inserted Image") 
     return True 

Это работало хорошо, пока я не добавил попробовать уловов. У меня действительно была функция if, elif, функция прошла нормально. Вот мой вызов и peice кода, который проходит прямо перед ним:

if rollback == False: 
     # Nah -- it's all good SAVE IT! 
     count += 1 
     log.debug("INSERT %s" % count) 
     conn.commit() 
    else: 
     # Yeah something went wrong, errors reported why, roll it back 
     conn.rollback() 
     log.debug("skipped %s" % skip_count) 

    # Insert images 
     if rollback == False: 
      sku = row[0] 
      if insert_image(cursor, object_id, sku) == False: 
       log.error("Could not get the image inserted for product: %s" % object_id) 
       conn.rollback() 
      else: 
       conn.commit() 

Моя ошибка:

16:33:46,153 DEBUG [pylons-admin] Inserted Description 
16:33:46,164 DEBUG [pylons-admin] Inserted Attributes 
16:33:46,164 DEBUG [pylons-admin] INSERT 1 
Traceback (most recent call last): 
File "<console>", line 47, in <module> 
NameError: name 'insert_image' is not defined 

Я не знаю, что линия 47 означает, потому что вызов находится на линии 2101, снова, пока я не добавил попытки, он нашел функцию просто прекрасной. Я также включил первую фиксацию перед вызовом insert_image, когда добавлял те попытки, которые вы видите сейчас, перед фиксацией после того, как мы вызвали insert_image. Я проверил отступы, пробелы и вкладки без ссылок.

Я использую TextMate, когда я запускаю скрипт из TextMate, я получаю ошибку синтаксиса здесь:

try urllib.urlopen("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku)): 

Это указывает на (на (папки ... Но я не понимаю, где у меня есть синтаксическая ошибка.Пожалуйста, помогите.Я работаю над этим скриптом в течение пары недель, это должен был пройти последний прогон, чтобы проверить и назвать его законченным :(

+1

-1: Ого, это много кода. Не могли бы вы сократить это до достаточно кода, чтобы показать проблему? –

ответ

3

У вас есть ошибки синтаксиса в вашей функции:

try urllib.urlopen("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku)): 
     urllib.URLopener().retrieve("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku), "%sPR-IT,PM.jpg" % (sku)) 
     found_url = True 
    except: 
     found_url = False 

Оно должно быть:

try: 
    urllib.urlopen("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku)): 
    urllib.URLopener().retrieve("http://<path to images>/%s/%sPR-IT,PM.jpg" % (folder, sku), "%sPR-IT,PM.jpg" % (sku)) 
    found_url = True 
except: 
    found_url = False 

У вас также есть некоторые общие уловы, которые ловят эти SyntaxErrors и скрыть ошибки, но insert_image не определен таким образом. Никогда не используйте один except:, всегда ставьте имя Исключения, которое вы хотите поймать. В противном случае вы также поймаете такие вещи, как SyntaxError, и это очень опасно.

+0

Я знал, что это было что-то очевидное. Спасибо. Я пришел из PHP и никогда раньше не использовал try. Как узнать, каково мое исключение? Я знаю, что это будет URL-адрес не найден, но как я знаю, что надеть за исключением? – KacieHouser

+1

Чтобы быть справедливым, вы почти никогда не сталкиваетесь с «Синтаксисом» во время выполнения; они создаются во время компиляции задолго до того, как выполняется блок 'try'. –

+0

ах, поэтому поэтому он не смог найти функцию, потому что, когда она выполняла ее, она обнаружила ошибку и просто попробовала исключить ее? Oooook. – KacieHouser

0

Это похоже на то, что перед методом вы имеете пробел. Неверное значение пробела переместило его за пределы обычного кодового пути, и если он находится в классе, он может больше не отображаться в классе

Смежные вопросы