免责声明:这个问题可能已经有答案了,但是我找不到那个具体的答案,只有更广泛的答案。
我正在尝试了解您进行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
。
以这种方式工作本身非常方便,因为它允许您将子功能分隔在一个可测试性更好的模块中。但是,如果您有很多“隐式”进口,情况会不会引起混淆?
答案 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