我正在处理一些自动为我生成的 python 代码。我想避免手动编辑这些 python 文件,因此出现这个问题:
foo.py:
def foo():
print "foo"
boo.py:
def boo():
foo.foo() # <-- global name 'foo' not defined
print "boo"
bar.py:
import foo
import boo
def bar():
boo.boo()
print "bar"
执行:
python.exe bar.py
给出了 boo
没有找到 foo
的错误。但是 bar 正在导入 foo
和 boo
。 foo
不应该自动提供给 boo
吗?
有办法吗?如前所述,boo.py 是自动为我生成的,我想避免将 import foo 添加到 boo.py。
谢谢。
最佳答案
But bar is importing both foo & boo. Shouldn't foo be automatically available to boo?
不,它不应该:import
,就像任何其他绑定(bind)名称的方式一样,将该名称绑定(bind)在一个单一的特定范围内,而不是“在您可能想要它的所有范围内” .
Is there a way to do so? As said boo.py is automatically generated for me & I want to avoid adding import foo to boo.py
有一个非常糟糕的 hack -- 我不想忍受它(我宁愿把我的精力投入到让 boo.py
修复的完全损坏的代码生成器上 --如果它有这样一个巨大的错误,比如缺少一个关键的需要的导入,它还会有什么其他的可怕之处?!),但是,嘿,这不是我的葬礼...;-)
让 bar.py
开始...:
import foo
import boo
import __builtin__
__builtin__.foo = foo
通过这种方式,您已经使标识符 foo
成为“假的、人造的内置名称”(唯一一种 在每个范围内都可用的名称,除非被隐藏通过名称的其他介入绑定(bind)
在更近的范围内)指的是模块 foo
。
不是 推荐的程序,只是针对构建 boo.py
的代码生成器中可怕、明显的错误的临时解决方法。 修复该错误,这样您就可以尽快退出此黑客攻击!
关于Python "import"作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3106089/