Python“从x导入y为z”,导入了什么?

时间:2018-07-20 09:25:07

标签: python

免责声明:这个问题可能已经有答案了,但是我找不到那个具体的答案,只有更广泛的答案。

我正在尝试了解您进行from x import y as z时发生的情况。

fs.py

def foo():
    return 'spam'

def do_something():
    return foo()

caller.py

from fs import do_something as do

def foo():
    return 'bacon'

print(do()) 

运行它:

>>python caller.py
spam

让我感到困惑的是,我指定“仅导入fs.do_something”,但是我也隐式得到了 fs.foo()(即我没有明确要求它)。显然,Python甚至没有在foo()中寻找caller.py

以这种方式工作本身非常方便,因为它允许您将子功能分隔在一个可测试性更好的模块中。但是,如果您有很多“隐式”进口,情况会不会引起混淆?

1 个答案:

答案 0 :(得分:0)

不,您不会隐式获得fs.foo()

如果我们就地“扩展”导入(这不是不是,Python实际上是如何做的,但是为了说明起见):

# (from fs import do_something as do)

def fs___foo():  # (this is _not_ actually visible in `caller`'s namespace!)
    return 'spam'

def fs___do_something():
    return fs_foo()

do = fs___do_something

# (end of simulated import)

def foo():
    return 'bacon'

print(do()) 
print(foo()) 

spam
bacon