Python模块覆盖双下划线

杰瑞姆

有人知道为什么我的__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__

然后以这种方式使用它?

马丁·彼得斯(Martijn Pieters)

如果目标模块没有属性(如果仅导入该属性中列出的名称),则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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python导入下划线模块

来自分类Dev

python导入下划线模块

来自分类Dev

NodeJS中的双下划线与单下划线

来自分类Dev

用双下划线替换单个下划线

来自分类Dev

Python:具有双下划线的类

来自分类Dev

了解__(双下划线)在python中的实际用法

来自分类Dev

变量前加双下划线

来自分类Dev

禁用续集的双下划线行为

来自分类Dev

在C中使用双下划线

来自分类Dev

以单下划线或双下划线开头的函数和变量

来自分类Dev

使用 Windows 重命名将单个下划线替换为双下划线?

来自分类Dev

如何建议在Python中使用自定义双下划线变量?

来自分类Dev

Python中奇怪的双下划线属性(__attribute__)是什么?

来自分类Dev

如何使用JavaScript删除双下划线

来自分类Dev

JavaFX文本双下划线间距

来自分类Dev

用双下划线按类名查找元素

来自分类Dev

iPython-更改双下划线(魔术)属性的颜色?

来自分类Dev

如何使用JavaScript删除双下划线

来自分类Dev

PHP中的双下划线是什么意思?

来自分类Dev

作业要加双下划线-Sublime和R

来自分类Dev

双下划线,其中一个虚线

来自分类Dev

如果col q = *,则宏双下划线范围

来自分类Dev

DataGridView双下划线单元格

来自分类Dev

Python类名中的下划线

来自分类Dev

Python下划线内部列表

来自分类Dev

python下划线函数名称

来自分类Dev

如何使Sphinx autodoc扩展包含下划线/私有Python模块

来自分类Dev

文字修饰下划线覆盖了文字块的测试

来自分类Dev

下划线排序