如何与x import *'发生冲突?进口解决?

时间:2015-02-13 10:04:46

标签: python python-3.x import

考虑以下两个模块:

# a.py
x = 1

# b.py
x = 2

以下程序的输出是否在所有Python 3实现中定义良好且相同?

from a import *
from b import *
print(x)

1 个答案:

答案 0 :(得分:0)

根据内置函数__import__()的文档(在每个import语句的幕后调用):

  

...语句from spam.ham import eggs, sausage as saus导致

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage
     

此处,spam.ham模块从__import__()返回。从此对象中,将检索要导入的名称并将其分配给各自的名称。

虽然这种解释是指导入特定名称,但机制很明确:首先,导入模块,然后将该模块的相关属性分配给本地名称空间中的名称。

因此,,行为定义明确:因from a import *而分配的任何名称与后续from b import *指定的名称冲突的名称都是被覆盖,就像他们在

的普通重新分配的情况下一样
x = 1
x = 2

请注意,即使您通过使用自定义导入功能替换builtins.__import__()来搞乱导入机制,这仍然是正确的:

>>> class Fake: pass
... 
>>> def fake_import(name, *args, **kwargs):
...     module = Fake()
...     module.x = name
...     return module
... 
>>> import builtins
>>> builtins.__import__ = fake_import
>>> from nonexistent.module import *
>>> x
'nonexistent.module'
>>> from another_made_up_name import *
>>> x
'another_made_up_name'
>>>