2013-11-18 3 views
0

Я новичок в программировании и Python - идеальный шторм ...UnboundLocalError: локальная переменная «вн» обращаться до присвоения

Несмотря на долго, это лишь фрагмент более 1300 строк оригинального кода. Что я добавляю это способность

  • расщепленных имен файлов в root.ext
  • определить расширение файла (вн)
  • предел загрузки файлов с определенными расширениями файлов (extList)
  • Throw/дисплей исключение, если расширение файла не extList
  • позволяет загрузить файл, если файл находится в extList
  • переименовать файл, используя оригинальное расширение файла

Код работал до тех пор, пока я не добавил логику расширения файла. Traceback из журнала apache - это последняя пара строк, но я не могу решить исключение UnboundLocalError: local variable 'ext' referenced before assignment.

Линия 1024, ext not in extList, которая вызывает остановку кода, находится над линиями трассировки.

Помощь? Что мне здесь не хватает?

def HandleProcessFormRequest(uploadWhat, 
          uploadPath, 
          formInfoHtml, 
          fieldStorage): 
    WritePrologueHtml(uploadWhat = uploadWhat) 

    uploadFileitem = fieldStorage["upload_file"] 
    if ((uploadFileitem == None)  or 
     (not uploadFileitem.filename) or 
     (uploadFileitem.filename == "") or 
     (not uploadFileitem.file)): 
     WriteErrorAndFormAndEpilogueHtml(
      html = "You must specify the upload file.", 
      uploadWhat = uploadWhat, 
      formInfoHtml = formInfoHtml, 
      fieldStorage = fieldStorage) 
     return 

    storeFilename = "" 
    if uploadWhat == "c130j": 
     tailNumber = GetValidFormSelectValue(
      name   = "tail-number", 
      options  = C130JTailNumberOptions, 
      fieldStorage = fieldStorage) 
     if tailNumber == "": 
      WriteErrorAndFormAndEpilogueHtml(
       html   = "You must specify a valid tail number.", 
       uploadWhat = uploadWhat, 
       formInfoHtml = formInfoHtml, 
       fieldStorage = fieldStorage) 
      return 
     base = GetValidFormSelectValue(
      name   = "base", 
      options  = C130JBaseOptions, 
      fieldStorage = fieldStorage) 
     if base == "": 
      WriteErrorAndFormAndEpilogueHtml(
       html   = "You must specify a valid base.", 
       uploadWhat = uploadWhat, 
       formInfoHtml = formInfoHtml, 
       fieldStorage = fieldStorage) 
      return 
     downloadDate = GetValidFormDateValue(
      name   = "download-date", 
      fieldStorage = fieldStorage, 
      defaultValue = None) 
     if (downloadDate is None) or (downloadDate == ""): 
      WriteErrorAndFormAndEpilogueHtml(
       html   = "You must specify a valid download date.", 
       uploadWhat = uploadWhat, 
       formInfoHtml = formInfoHtml, 
       fieldStorage = fieldStorage) 
      return 

     extList = [".fdr", ".fdt", ".dat"] 

     if ext not in extList: 
      WriteErrorAndFormAndEpilogueHtml(
       html   = "You may only upload fdr/fdt/dat files", 
       uploadWhat = uploadWhat, 
       formInfoHtml = formInfoHtml, 
       fieldStorage = fieldStorage) 

     root, ext = os.path.splitext(splitfilename) 

     if ext in extList: 
      ext = str(ext.lower())  
      return ext 

Исключение:

Traceback (most recent call last): 
    File "/home/vhosts/isis-pmr/profile/upload/c130jupload.py", line 7, in <module> 
    formInfoHtml = None) 
    File "/home/vhosts/isis-pmr/profile/upload/uploadlib.py", line 1371, in HandleRequest 
    fieldStorage = fieldStorage) 
    File "/home/vhosts/isis-pmr/profile/upload/uploadlib.py", line 1024, in HandleProcessFormRequest 
    if ext not in extList: 
UnboundLocalError: local variable 'ext' referenced before assignment 
+0

Ваша функция 'def ext (string): return ext' не имеет смысла, но может дать ключ к проблеме, которую вы испытываете (обратите внимание, однако, что она не связана с вашим фактическим сообщением об ошибке). Что вы ожидаете от этой функции? – chepner

+0

Я вырезал весь код, который здесь не был проблемой, поэтому ваш пост намного легче читать. –

ответ

3

Ну, ext не определена в этой строке, поэтому ошибка не удивительно. Вы на самом деле не определить его до заявления на следующий:

if ext not in extList: 
    WriteErrorAndFormAndEpilogueHtml(
     html   = "You may only upload fdr/fdt/dat files", 
     uploadWhat = uploadWhat, 
     formInfoHtml = formInfoHtml, 
     fieldStorage = fieldStorage) 

root, ext = os.path.splitext(splitfilename) 

Вы должны переместить эту последнюю строку перед тем линию, где вы используете ext. Вы можете комбинировать тест с другойif ext in extList: испытания под ним:

root, ext = os.path.splitext(splitfilename) 

ext = ext.lower() 
if ext in extList: 
    return ext 
else: 
    WriteErrorAndFormAndEpilogueHtml(
     html   = "You may only upload fdr/fdt/dat files", 
     uploadWhat = uploadWhat, 
     formInfoHtml = formInfoHtml, 
     fieldStorage = fieldStorage) 

Обратите внимание, что я измененном как ext к нижнему регистру здесь; нет никакого смысла в тестировании ext против списка расширений нижнего регистра в противном случае; ext без нижнего кожуха не будет в extList, если только он уже является строчным.

+0

Я понятия не имею, что это должно передать ..... –

+0

... ошибка оператора ... Я редактировал свое оригинальное сообщение выше. Я изменил код так, как вы предлагали, только для создания новой проблемы.Теперь у меня есть непредвиденная ошибка отступа для инструкции «try». Я добавил строки над добавленным #комментами справа от кода. Благодаря! – iassllc

+1

@iassllc: Это потому, что ваш отступы повсюду. Отступ в Python очень важен, и ваша 'try:' должна соответствовать предыдущей строке. Поскольку это ** новая ** проблема, вы должны держать это в стороне от этого вопроса, действительно. Держите сообщение полезным для будущих посетителей, а не только для себя. –

1

В основном, что говорит UnboundLocal, вы указали переменную, прежде чем присвоить ей значение.

>> if ext not in extList: 
.... 
>> root, ext = os.path.splitext(splitfilename) 

Может быть, попробуйте указать корень, назначение ext перед тем, как вы попросите использовать ext?

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