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
是我的自定义模块的名称。
基于回溯,似乎之一:
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,特别是在命名约定的方法...
是的,它是2.我之后的文件夹被称为“模型”而不是“模型”。谢谢 – CiaranWelsh
@ user3059024如果'models' **或**' Models'都可以,因为并非所有文件系统都区分大小写,您可以考虑'if i.lower()=='models':'。 – jonrsharpe
models_path
被初始化,只有当:
-
self.project_dir
有一些文件/目录和 - 其中一个此文件/目录有名称
models
如果其中一个条件未满,则models_path
未初始化。
你能给完整的追溯?另外'__ weird_method_names__'有什么 - 这些不是真正的魔术方法,你不应该这样命名它们。 – jonrsharpe
分离将用于创建其他类的属性的方法。这是不是约定还是我错过了什么?是的,当然。 – CiaranWelsh
如果它们对于该类是私有的,则使用'_single_leading_underscore'。 '__double_leading_and_trailing_underscore__'用于预定义的“魔术方法”*,比如'__init__'和'__str__'。 – jonrsharpe