Python模块覆盖双下划线

时间:2014-11-06 20:59:23

标签: python django

有谁知道我的__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__

然后就这样使用它?

1 个答案:

答案 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在任何情况下使用__*__名称,如果没有明确记录使用,可能会在没有任何警告的情况下破损。