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

时间:2017-08-08 22:34:34

标签: python import namespaces python-import python-internals

从命令行运行脚本,该脚本的__name__属性将为'__main__'。但import来自不同位置的脚本,该模块的__name__属性将是脚本的名称。

python如何知道__name__应该是什么价值?脚本可以告诉它是否已导入,并相应地设置__name__属性?

2 个答案:

答案 0 :(得分:1)

From the docs

  

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

     

<强> __name__
  必须将__name__属性设置为模块的完全限定名称。此名称用于唯一标识导入系统中的模块。

所以这些魔术属性是在所谓的“导入机器”中分配的。您还可以阅读更多详细信息about that system in the docs

答案 1 :(得分:1)

  

问: python如何知道__name__应该是什么价值?

好吧,如果你写import foo,Python将寻找一个名为'foo'的模块并将其名称设置为'foo'。

  

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

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

此测试失败的特定情况是您有一个名为__main__的模块(在名为__main__.py的文件中)。

如果您想要100%更加确定,可以检查frames并查看模块是否位于堆栈顶部:

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__ = 'bar'

虽然没有理由这样做,除了产生混淆并可能引入错误。