Python“导入”范围

发布于 2021-01-29 18:01:50

我正在处理自动为我生成的一些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都导入fooboo。不应foo自动提供给boo

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

谢谢。

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    但是bar会同时导入foo和boo。foo是否应该自动可用于boo?

    不,它不应该:import与其他任何绑定名称的方式一样,将名称绑定在单个特定的范围内,而不是“在可能需要的所有范围内”。

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

    有一个非常糟糕的hack-我不想忍受它(我宁愿投入我的精力来使这个完全损坏的代码生成器可以boo.py修复-
    如果它有一个巨大的错误,例如缺少关键的必要导入,它还可以存储什么其他恐怖内容?!),但是,这不是 我的 葬礼… ;-)

    bar.py开始…:

    import foo
    import boo
    import __builtin__
    __builtin__.foo = foo
    

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

    推荐使用此过程,只是针对构建的代码生成器中的可怕,明显漏洞的临时解决方法boo.py修复该错误, 以便您可以尽快停用此黑客!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看