Python“;进口;范围

Python“;进口;范围,python,import,Python,Import,我正在处理一些为我自动生成的python代码。我希望避免手动编辑这些python文件&因此出现以下问题: foo.py: boo.py: 执行: python.exe bar.py 给出一个boo未找到foo的错误。但bar同时导入了foo和boo。foo是否应该自动提供给boo 有没有办法做到这一点?如上所述,boo.py是为我自动生成的&我希望避免将import foo添加到boo.py中 谢谢。否。如果您希望foo在boo中可用,则需要在boo中导入它。bar中的import foo仅使f

我正在处理一些为我自动生成的python代码。我希望避免手动编辑这些python文件&因此出现以下问题:

foo.py:

boo.py:

执行:

python.exe bar.py

给出一个
boo
未找到
foo
的错误。但bar同时导入了
foo
boo
foo
是否应该自动提供给
boo

有没有办法做到这一点?如上所述,boo.py是为我自动生成的&我希望避免将import foo添加到boo.py中


谢谢。

否。如果您希望
foo
boo
中可用,则需要在
boo
中导入它。
bar
中的
import foo
仅使
foo
bar
模块中可用

一般来说,Python中的
import
语句有点像变量定义。你可以这样想:精神上的替代

import boo

\uuuuuu import\uuuuu
是Python解释器的内置函数,它要么导入模块,要么查找对现有模块的引用(如果已经导入),然后返回该引用)

任何自动生成boo.py的东西都是错误的。它应该在该文件的某个地方添加
import foo
。您可以在
bar.py
中执行以下操作:

import foo
import boo
boo.foo = foo

但你真的不应该这么做。(我附和亚历克斯·马泰利(Alex Martelli)所说的这类事情是一个巨大的黑客)

你必须在boo中导入foo

笨蛋

import foo

def boo():
  foo.foo()    # <-- global name 'foo' not defined
  print "boo"

每个模块都有自己的名称空间。因此,为了让boo.py从外部模块中看到一些东西,boo.py必须自己导入它

可以编写一种语言,其中名称空间按您期望的方式堆叠:这称为动态作用域。有些语言,如原始lisp、早期版本的perl、postscript等,确实使用(或支持)动态范围

大多数语言使用词法范围。事实证明,对于语言来说,这是一种更好的工作方式:通过这种方式,模块可以根据自己的代码推断它将如何工作,而不必担心如何调用它

有关更多详细信息,请参阅本文:

但酒吧同时进口了foo和boo。 foo不应该自动被删除吗 boo有空吗

不,它不应该:
import
,就像任何其他绑定名称的方法一样,将该名称绑定到一个特定的作用域中,而不是“在所有可能需要它的作用域中”

有没有办法做到这一点?如前所述 boo.py是为 我希望避免添加导入foo(&I) 嘘

有一个非常糟糕的黑客——我不想忍受它(我宁愿把我的精力投入到让
boo.py
修复的完全坏掉的代码生成器上——如果它有一个巨大的bug,比如缺少一个关键的必需的导入,它还能有什么可怕的东西呢?!),但是,嘿,这不是我的葬礼…;-)

bar.py
start…:

import foo
import boo
import __builtin__
__builtin__.foo = foo
通过这种方式,您使identifier
foo
成为一个“虚假的、人工的内置名称”(唯一一种可从每个作用域使用的名称,除非被该名称的其他中间绑定所遮蔽) 在更近的范围内)指的是模块
foo


不是推荐的过程,只是针对构建
boo.py
的代码生成器中可怕、耀眼的错误的临时解决方法。把那个bug修好,这样你就可以尽快让这个黑客退役了

您可以使用importlib模块 模块一旦导入,就无法重新导入, 试用
导入模块名称
导入导入lib

importlib.reload(模块名称)

但是,您需要首先导入该模块(模块名称),还需要导入lib


好啊谢谢我会再等一段时间,让其他人插话。如果有人有什么把戏。否则-我必须做我必须做的!K.我们现在将手动将导入foo添加到这些py文件中,稍后修复该工具。我有时讨厌python的这种“严格性”,但随着时间的推移,我明白了这一点——它通常是“正确的方式”。谢谢。循环导入表明存在设计错误。当代码耦合过紧时,解决问题很困难。。。重构是唯一的解决方案;)这就是我喜欢python的原因:)@drevicko,谢谢,我一定是6年前误读了这条线索。或者,或者只是我的离题沉思,这也是可信的…;)好啊我会要求伙计们手动添加“导入foo”到所有这些py文件中。稍后我将修复这个.py生成工具。谢谢。@AlexMartelli我碰到了这个黑客,就我而言,它已经足够好了。但是我仍然对把名字放进
\uuuu内置\uuu
的所有含义感到困惑。除了名称冲突的明显问题之外,还有其他值得注意的陷阱吗?
boo = __import__('boo')
import foo
import boo
boo.foo = foo
import foo

def boo():
  foo.foo()    # <-- global name 'foo' not defined
  print "boo"
import boo

def bar():
  boo.boo()
  print "bar"
import foo
import boo
import __builtin__
__builtin__.foo = foo