繁体   English   中英

python如何知道__name__应该是什么?

[英]How does python know what __name__ should be?

从命令行运行脚本,该脚本的__name__属性将为'__main__' 但是从另一个位置import该脚本时,该模块的__name__属性将是脚本的名称。

python如何知道__name__的值是什么? 脚本可以告诉它正在导入,并相应地设置__name__属性吗?

来自文档

导入机制会在加载程序执行模块之前,根据模块规范在每个模块对象上填充这些属性。

__name__
__name__属性必须设置为模块的标准名称。 此名称用于唯一地标识导入系统中的模块。

因此,这些魔术属性是在所谓的“导入机制”中分配的。 您也可以在文档中阅读有关该系统的更多详细信息。

问: python如何知道__name__的值是多少?

好吧,如果您编写import foo Python将查找名为'foo'的模块并将其名称设置为'foo'。

问:一个模块可以告诉它正在导入吗,...

是的,它可以。 通常,人们使用if __name__ == '__main__'执行此操作-如果测试通过,则通常表示模块正在执行;如果测试失败,则通常表示正在导入。

如果您有一个名为__main__ (在名为__main__.py的文件中),则该测试将失败的一个特殊情况。

如果您想更加确定100%,可以检查框架并查看模块是否在堆栈的顶部:

f = sys._getframe()
if f.f_back is None:
    # We're at the top of the stack: this module is being executed.
else:
    # There's a frame on top of us: this module has been imported.

问: ...并相应地设置__name__属性?

是的,您可以通过简单设置将__name__更改为__name__内容:

__name__ = 'bar'

尽管没有理由这样做,但除了引起混乱并可能引入错误外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM