我正在处理为我自动生成的一些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
和&amp; boo
。 foo
不应该boo
自动可用吗?
有没有办法这样做?如上所述 boo.py 是为我自动生成的。我想避免将import foo添加到 boo.py 。
感谢。
答案 0 :(得分:15)
但是bar正在导入foo和amp;嘘。 不应该自动foo 可以嘘?
不,它不应该:import
,像任何其他方式绑定名称一样,将该名称绑定在一个特定的范围内,而不是“在你可能想要它的所有范围内”。
有没有办法这样做?如上所述 boo.py是自动生成的 我和我我想避免添加import foo 到boo.py
有一个非常糟糕的黑客 - 我不想忍受它(我更倾向于投入精力去获得使boo.py
修复的完全破坏的代码生成器 - 如果有这样的话巨大的错误,因为错过了一个至关重要的需要导入,它可以存储的其他恐怖?!),但是,嘿,它不是我的葬礼...; - )
让bar.py
开始......:
import foo
import boo
import __builtin__
__builtin__.foo = foo
通过这种方式,您可以将标识符foo
设置为“假的,人为的内置名称”(除非其他干预措施遮蔽,否则 的唯一名称可用于所有范围)绑定名称
在更近的范围内)引用模块foo
。
不推荐的过程,只是构建boo.py
的代码生成器中可怕的,明显的错误的临时解决方法。 修复该错误,以便尽快退出此黑客!
答案 1 :(得分:4)
没有。如果您希望foo
中有boo
,则需要在boo
中导入import foo
。 bar
中的foo
仅在bar
模块中提供import
。
通常,Python中的import boo
语句有点像变量定义。你实际上可以这样想:精神上取代
boo = __import__('boo')
与
__import__
(boo.py
是Python解释器的内置函数,可以导入模块,也可以查找现有模块的引用(如果已经导入),并返回该引用)
自动生成import foo
的任何内容都是错误的。它应该在该文件中的某处添加bar.py
。您可以在import foo
import boo
boo.foo = foo
中执行此操作:
{{1}}
但你真的不应该这样做。 (我回应Alex Martelli所说的关于这种事情是一个巨大的黑客攻击)
答案 2 :(得分:4)
你必须在boo中导入foo
boo.py
import foo
def boo():
foo.foo() # <-- global name 'foo' not defined
print "boo"
bar.py
import boo
def bar():
boo.boo()
print "bar"
答案 3 :(得分:4)
每个模块都有自己的命名空间。因此,对于boo.py来看外部模块的东西,boo.py必须自己导入它。
可以编写一种语言,其中命名空间按照您期望的方式堆叠:这称为动态范围。一些语言,如原始的lisp,早期版本的perl,postscript等,确实使用(或支持)动态范围。
大多数语言都使用词法作用域。事实证明,这是一种更好的语言工作方式:这样一个模块可以根据自己的代码推断它的工作方式,而不必担心它是如何被调用的。
有关其他详细信息,请参阅此文章:http://en.wikipedia.org/wiki/Scope_%28programming%29
答案 4 :(得分:0)
你可以使用 importlib 模块
一旦模块被导入,它就不能被重新导入,
尝试使用
import module_name
import importlib
importlib.reload(module_name)
但是你需要先导入那个模块(module_name),然后导入lib。