UnboundLocalError初始化python类

问题描述:

我正在创建一个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

基于回溯,似乎之一:

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,但这只会在稍后才会隐藏问题。


旁注:按我的意见,你应该看看style guide,特别是在命名约定的方法...

+0

是的,它是2.我之后的文件夹被称为“模型”而不是“模型”。谢谢 – CiaranWelsh

+1

@ user3059024如果'models' **或**' Models'都可以,因为并非所有文件系统都区分大小写,您可以考虑'if i.lower()=='models':'。 – jonrsharpe

models_path被初始化,只有当:

  • self.project_dir有一些文件/目录和
  • 其中一个此文件/目录有名称models

如果其中一个条件未满,则models_path未初始化。