有人知道为什么我的__status__
字符串无法打印吗?我得到一个NameError
。但是,如果设置了CAT,它就可以打印CAT(它覆盖了它)。
所以我不能使用双下划线,因为它现在是模块settings_local的魔术属性?
settings.py
__status__ = "Base"
CAT = 5
try:
# This will work if a settings_local.py exists
from settings_local import *
except ImportError as e:
print "Add a settings_local blah blah"
sys.exit()
print __status__ # returns Base
print CAT # Returns 1
print settings_local.__status__ # Returns NameError
settings_local.py
__status__ = "Development"
CAT = 1
我应该只在settings_local.py中执行此操作吗?
status = __status__
然后以这种方式使用它?
如果目标模块没有属性(如果仅导入该属性中列出的名称),则该from <module> import *
语法将忽略以下划线开头的__all__
名称。从import
声明文档中:
如果标识符列表由星号(
'*'
)替换,则模块中定义的所有公共名称都将绑定在import
语句的本地名称空间中。模块定义的公共名称是通过检查模块的命名空间中名为的变量来确定的
__all__
;如果已定义,则必须是由该模块定义或导入的名称的字符串序列。给出的名称__all__
均被视为公开名称,必须存在。如果__all__
未定义,则公共名称集将包含在模块命名空间中找到的所有名称,这些名称都不以下划线字符('_'
)开头。
(我的大胆强调)。
此外,您没有导入settings_local
模块本身;NameError
之所以抛出该异常是因为您没有导入模块,而是仅导入模块中包含的属性。这有效:
import settings_local
print settings_local.__status__
您的其他选择是:
两个导入语句:
from settings_local import *
try:
from settings_local import __status__
except ImportError:
# no __status__ defined in the local settings
pass
__all__
向settings_local.py
模块添加列表:
__all__ = ['CAT', '__status__']
__status__ = "Development"
CAT = 1
请注意,Python建议不要创建新__*__
名称:
Any
__*__
在任何情况下,未遵循明确记录的使用方式的名称使用,均会受到破坏,恕不另行通知。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句