Python - how do I write a “getter” function that will return a variable stored in my module (initiating it first if needed)?
Possible Duplicate:
UnboundLocalError: local variable ‘url_request’ referenced before assignment
以下是我的模块的完整代码,称为util.py:
1 2 3 4 5 6 7 8
| import my_other_module
__IMPORTANT_OBJECT__ = None
def getImportantObject():
if __IMPORTANT_OBJECT__ is None:
__IMPORTANT_OBJECT__ = my_other_module.ImportantObject()
return __IMPORTANT_OBJECT__ |
我的理解是,前缀为双下划线的变量被认为是模块的私有变量。这里的想法是,我要存储对重要对象的私有引用,并将其返回给通过getImportantObject()方法请求它的任何人。但在第一次调用此方法之前,我不希望启动对象。
但是,当我运行代码时,会得到以下错误:
1 2 3
| File"/Users/Jon/dev/util.py", line 6, in getImportantObject
if __IMPORTANT_OBJECT__ is None:
UnboundLocalError: local variable '__IMPORTANT_OBJECT__' referenced before assignment |
我在这里要做的事情,推荐的方法是什么?
- 您不应该发明新的__dunder__名称,它们是留给python解释器btw的。
- 谢谢,Ned。我应该怎么做?我希望变量是私有的(至少按照约定,如果不是由Python严格执行的话)。
- @joncrowell:只使用前导下划线,不使用尾随:__IMPORTANT_OBJECT。
- 啊,好吧——非常感谢。
该变量不被视为私有变量,而是被视为局部变量。
使用global关键字将其标记为:
1 2 3 4 5
| def getImportantObject():
global __IMPORTANT_OBJECT__
if __IMPORTANT_OBJECT__ is None:
__IMPORTANT_OBJECT__ = my_other_module.ImportantObject()
return __IMPORTANT_OBJECT__ |
- 我试过了,但还是犯了同样的错误。UnboundLocalError: local variable '__IMPORTANT_OBJECT__' referenced before assignment
- @琼克劳尔:仔细检查你做了什么。您可能输入了错误的变量名。
- 你说得对,我说得对!但现在我要找EDOCX1[1]
- @所以现在它不匹配模块范围变量分配(__IMPORTANT_OBJECT__ = None)。名字必须匹配!
- 我正在仔细查看我的代码。变量名在函数的第一行、第二行、第三行和第四行中各出现一次。我已经确认了它们在每种情况下都是相同的。(如果我搜索并突出显示,所有四行中的变量名都匹配并突出显示,因此它们必须相同),我删除了后面的下划线(根据上面的注释)。所以我在每一行中都有__IMPORTANT_OBJECT,错误指向if __IMPORTANT_OBJECT is None:行,并告诉我‘名称错误:全局名称’没有定义‘重要对象’
- @joncrowell:也就是说,在模块范围内,没有名为__IMPORTANT_OBJECT的变量。没有看到你的代码,我什么都说不出来。
- 啊,好吧,我现在明白了。我假设在您最初的回答中,您告诉我在函数中移动变量声明,而python对global关键字做了一些神奇的工作,使它成为一个全局变量,即使它是在函数中定义的。但是我猜发生的事情是,我必须声明函数外部的变量,然后告诉我的函数我要引用全局变量。
- @琼克罗:宾果。-)
- @乔恩·克劳威尔:当您在某些情况下将名称从__IMPORTANT_OBJECT__改为__IMPORTANT_OBJECT时,python解释器可能会通过添加另一个前缀来更改名称(更改它),因为它认为它是一个私有类名。尝试将其更改为只有一个前导下划线,即_IMPORTANT_OBJECT。
- @马蒂诺:问题已经解决了;模块级的__IMPORTANT_OBJECT__ = None线被删除;一个误解。