python __name__属性带来命名空间问题

代码如下:

https://code.csdn.net/lijiecong/examples/tree/master/python/clicktest


有两个python源文件

clicktest.py

clicktest2.py

    其中clicktest2.py通过importlib动态加载clicktest,clicktest.py直接通过 from import引用 clicktest2.py中的 cli,并且往cli里加载commit函数。

如果直接运行python clicktest2.py ,通过打印可以发现clicktest2.py里打印出来的cli.commands永远只有 clicktest2中的函数,而没有clicktest加的额外commit函数。但clicktest中能打印出commit和sync两个函数。

   而如果通过在python交互环境中import clicktest2的方式运行,却可以看到sync和commit都加入了。

仔细观察 module name和 cli id可以发现是python设置模块加载名字引起的问题,python clicktest2.py 会设置 clictest2的__name__为 ‘__main__’,

当clicktest   from clicktest2 import cli时,python发现没有模块名字叫 clicktest2( 先前加载的clicktest2的模块名字被设置为__main__),所以把clicktest2加载到了

命名空间clicktest2中,相当于 有两个cli分别存在于命名空间 __main__ 以及 clicktest2,是两个不同的变量。 第一行打印出的 cli  ID 41672376是由 python clicktest2.py加载的,第二个 cli  ID 46053920 是有 clicktest中 from clicktest2 import cli加载的。

    同时看到如果在python交互环境中通过import clicktest2, 然后直接entry_point ,那么只有一个 cli位于module name  clicktest2中。因为import clictest2设置的模块名字为clicktest2,当clicktest  运行from clicktest2 import cli时,python发现已经有clicktest2模块了,就从已经加载的模块中提取cli。

  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值