Python“导入”scop

2024-06-09 18:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

食物比:

def foo():
  print "foo"

boo.py:

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

条形图.py:

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

执行:

python.exe bar.py

给出一个boo未找到foo的错误。但bar同时导入了foo&;boofoo不应该自动对boo可用吗?

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

谢谢。


Tags: 文件代码namepyimport编辑foodef
3条回答

不。如果你想fooboo中可用,你需要在boo中导入它。位于bar中的import foo只使foobar模块中可用。

通常,Python中的import语句类似于变量定义。你可以这样想:精神替代

import boo

boo = __import__('boo')

__import__是Python解释器的一个内置函数,它可以导入一个模块,或者查找对已导入的现有模块的引用,并返回该引用)

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

import foo
import boo
boo.foo = foo

但你真的不该这么做。(我赞同亚历克斯·马泰利所说的这种事情是一个巨大的黑客行为)

But bar is importing both foo & boo. Shouldn't foo be automatically available to boo?

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

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

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

bar.py开始…:

import foo
import boo
import __builtin__
__builtin__.foo = foo

这样,您就可以使标识符foo成为一个“假的、人工的内置名称”(只有一种名称可以从每个作用域中使用,除非被名称的其他中间绑定所隐藏 在更近的范围内)指的是模块foo

不是推荐的过程,只是构建boo.py的代码生成器中可怕的、突出的错误的临时解决方案。把那个错误修好,这样你就可以尽快退出这个黑客程序了!

你必须在boo中导入foo

波比

import foo

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

酒吧.py

import boo

def bar():
  boo.boo()
  print "bar"

相关问题 更多 >