2015-11-05 2 views
0

Я создаю класс Python, но, похоже, я не могу заставить класс конструктора работать правильно. Вот мой класс:UnboundLocalError, инициализирующий класс python

class IQM_Prep(SBconcat): 
    def __init__(self,project_dir): 
     self.project_dir=project_dir #path to parent project dir 
     self.models_path=self.__get_models_path__() #path to parent models dir 
     self.experiments_path=self.__get_experiments_path__()  #path to parent experiemnts dir 

    def __get_models_path__(self): 
     for i in os.listdir(self.project_dir): 
      if i=='models': 
       models_path=os.path.join(self.project_dir,i) 
     return models_path 

    def __get_experiments_path__(self): 
     for i in os.listdir(self.project_dir): 
      if i == 'experiments': 
       experiments_path= os.path.join(self.project_dir,i) 
     return experiments 

Когда я инициализировать этот класс:

project_dir='D:\\MPhil\\Model_Building\\Models\\TGFB\\Vilar2006\\SBML_sh_ver\\vilar2006_SBSH_test7\\Python_project' 

IQM= Modelling_Tools.IQM_Prep(project_dir) 

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 

    File "<ipython-input-49-7c46385755ce>", line 1, in <module> 
    runfile('D:/MPhil/Python/My_Python_Modules/Modelling_Tools/Modelling_Tools.py', wdir='D:/MPhil/Python/My_Python_Modules/Modelling_Tools') 

    File "C:\Anaconda1\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 585, in runfile 
    execfile(filename, namespace) 

    File "D:/MPhil/Python/My_Python_Modules/Modelling_Tools/Modelling_Tools.py", line 1655, in <module> 
    import test 

    File "test.py", line 19, in <module> 
    print parameter_file 

    File "Modelling_Tools.py", line 1536, in __init__ 
    self.models_path=self.__get_models_path__() #path to parent models dir 

    File "Modelling_Tools.py", line 1543, in __get_models_path__ 
    return models_path 

UnboundLocalError: local variable 'models_path' referenced before assignment 

Modelling_Tools это имя моего пользовательского модуля.

+1

Не могли бы вы дать полный обзор? Также, что с '__weird_method_names__' - это не настоящие магические методы, вы не должны называть их таким образом. – jonrsharpe

+0

Чтобы разделить методы, которые будут использоваться для создания атрибутов класса из других. Разве это не конвенция или я что-то упускаю? И да, конечно. – CiaranWelsh

+2

Если они являются закрытыми для класса, используйте '_single_leading_underscore'. '__double_leading_and_trailing_underscore__' предназначен для заранее определенных *« магических методов »*, таких как' __init__' и '__str__'. – jonrsharpe

ответ

1

Основываясь на TRACEBACK, кажется, что либо:

def __get_models_path__(self): 
    for i in os.listdir(self.project_dir): # 1. this never loops; or 
     if i=='models': # 2. this never evaluates True 
      models_path=os.path.join(self.project_dir,i) # hence this never happens 
    return models_path # and this causes an error 

Вы должны рассмотреть результат os.listdir(self.project_dir) выяснить, почему; либо каталог пуст, либо ничего в нем не указан models. Вы можете инициализировать, например. models_path = None в начале метода, но это только скроет проблему до более позднего времени.


Sidenote: на мои комментарии, вы должны проверить style guide, в частности, на именования методов ...

+0

Да, это было 2. Папка, которую я получил, называется 'Модели', а не' models'. Спасибо – CiaranWelsh

+1

@ user3059024, если 'models' ** или **' Models' будут в порядке, так как не все файловые системы чувствительны к регистру, вы можете рассмотреть 'if i.lower() == 'models':'. – jonrsharpe

0

models_path инициализируется только тогда, когда:

  • self.project_dir имеет некоторые файлы/директории и
  • один из этих файлов/директорий имеет имя models

Если одно из этих условий не заполнено, то models_path не инициализируется.

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