Python“导入”范围

时间:2010-06-23 22:41:37

标签: python import

我正在处理为我自动生成的一些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; boofoo不应该boo自动可用吗?

有没有办法这样做?如上所述 boo.py 是为我自动生成的。我想避免将import foo添加到 boo.py

感谢。

5 个答案:

答案 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 foobar中的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。