Python"导入"范围

sam*_*bha 8 python import

我正在处理为我自动生成的一些python代码.我想避免手动编辑这些python文件,因此这个问题/问题:

foo.py:

def foo():
  print "foo"
Run Code Online (Sandbox Code Playgroud)

boo.py:

def boo():
  foo.foo()    # <-- global name 'foo' not defined
  print "boo"
Run Code Online (Sandbox Code Playgroud)

bar.py:

import foo
import boo
def bar():
  boo.boo()
  print "bar"
Run Code Online (Sandbox Code Playgroud)

执行:

python.exe bar.py

给出了一个boo没有找到的错误foo.但是bar正在导入这两个foo&boo.不foo应该自动提供给boo

有办法吗?如上所述boo.py是为我自动生成的,我想避免将import foo添加到boo.py中.

谢谢.

Ale*_*lli 15

但是bar正在导入foo和boo.不应该自动嘘声?

不,它不应该:import像任何其他方式绑定名称一样,将该名称绑定在单个特定范围内,而不是"在所有范围内,您可能想要它".

有办法吗?如上所述boo.py是为我自动生成的,我想避免将import foo添加到boo.py中

有一个非常糟糕的黑客 - 我不想忍受它(我更倾向于把我的精力投入到完全破坏的代码生成器中boo.py修复 - 如果它有如此巨大的错误,因为缺少一个关键的需要导入,还有什么其他的恐怖可以存放?!),但是,嘿,这不是我的葬礼... ;-)

已经bar.py开始... ...:

import foo
import boo
import __builtin__
__builtin__.foo = foo
Run Code Online (Sandbox Code Playgroud)

这样,你所做的标识foo是"假的,人造的内置名"(唯一的一种名称即从每一个范围,除非在接近范围的名字的其他介入绑定阴影)指的是模块foo.

推荐的程序,只是构建代码生成器中可怕的,明显的错误的临时解决方法boo.py. 修复该错误,以便尽快退出此黑客!


Dav*_*d Z 5

不可以。如果您想foo在 中可用boo,则需要将其导入boo. 该import foo说是bar只能使foo中可用的bar模块。

通常,importPython 中的语句有点像变量定义。你实际上可以这样想:精神上替换

import boo
Run Code Online (Sandbox Code Playgroud)

boo = __import__('boo')
Run Code Online (Sandbox Code Playgroud)

(__import__是 Python 解释器的一个内置函数,它要么导入一个模块,要么在已经导入的情况下查找对现有模块的引用,并返回该引用)

任何自动生成的boo.py都是错误的。它应该import foo在该文件中的某处添加。您可以通过在以下位置执行此操作来解决它bar.py

import foo
import boo
boo.foo = foo
Run Code Online (Sandbox Code Playgroud)

但你真的不应该这样做。(我赞同 Alex Martelli 所说的这种事情是一个巨大的黑客)