有谁知道我的__status__
字符串无法打印的原因?我得到NameError
。然而,如果我设置它,它可以打印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__
然后就这样使用它?
答案 0 :(得分:4)
如果目标模块没有from <module> import *
属性(如果只导入该属性中列出的名称),__all__
语法将忽略以下划线开头的名称。来自import
statement documentation:
如果标识符列表被星号(
'*'
)替换,则模块中定义的所有公共名称都绑定在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 advises against creating new __*__
names:
Any
在任何情况下使用__*__
名称,如果没有明确记录使用,可能会在没有任何警告的情况下破损。