当前位置: 首页 > 面试题库 >

Python“导入”范围

谢选
2023-03-14
问题内容

我正在处理自动为我生成的一些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中

谢谢。


问题答案:

但是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修复该错误, 以便您可以尽快停用此黑客!



 类似资料:
  • 问题内容: 我正在导入许多不同的脚本,因此在文件的顶部,它会被导入语句弄得乱七八糟,即: 有没有办法将所有这些都移动到其他地方,然后我要做的就是导入该文件,所以它只是一个干净的导入? 问题答案: 当然有;只需在主文件所在的目录中创建一个名为的文件,然后将导入文件放置在该目录中即可。然后,您可以简单地在主脚本中使用。

  • 问题内容: 如何将winDLL导入python并能够使用其所有功能?它只需要双打和字符串。 问题答案: 您已经标记了问题ctype,所以听起来您已经知道答案了。 该ctypes的教程非常出色。阅读并理解该说明后,您将可以轻松完成。 例如: 还有我自己的代码中的一个示例:

  • 问题内容: 所以我得到这个错误 并且你可以看到我进一步使用了相同的import语句,并且可以正常工作吗?关于循环导入是否有一些不成文的规定?如何在调用堆栈的更下方使用同一类? 问题答案: 我认为jpmc26的答案虽然绝非错误,但在循环进口上却过于严格。如果正确设置它们,它们可以正常工作。 最简单的方法是使用语法,而不是。前者几乎总是可以工作,即使包括在内也能使我们重新获得利益。后者只有在中已经定义

  • 问题内容: 我有两个相关的Python“导入”问题。它们很容易测试,但是我想要的答案是语言定义的,而不是特定于实现的,而且我对样式/约定也很感兴趣,所以我在这里问。 1) 如果模块A导入模块B,模块B导入模块C,则模块A中的代码可以引用模块C而不进行显式导入吗?如果是这样,我是否认为这是错误的做法? 2) 如果导入模块ABC,那么是否也导入模块A和AB?如果是这样,按照惯例更好地进行显式表示吗?

  • 问题内容: 我的Python库刚刚将其主模块名称从更改为。对于向后兼容,仍然存在,但是将其导入会引发一些警告。现在,似乎仍然有一些示例程序从旧模块导入,但不是直接导入。 我想找到错误的陈述。有没有什么工具可以让我跟踪导入并找到罪魁祸首而无需费力看所有代码? 问题答案: 使用以下命令启动python解释器: 然后只是grep您的旧模块。

  • 问题内容: 我想这是一个普遍的问题,如果不能在正确的位置发布,抱歉。 比如说,我有一个import的函数。如果我要多次从另一个文件调用此函数,我是否假设导入也将多次进行?有没有办法仅在模块不存在时才导入? 基本上,我有一个类,它调用从各个文件导入的多个函数,而不是导入整个文件,我认为仅导入该函数会更容易,但是现在我想知道从长远来看是否会令自己头痛进口过多。 问题答案: 正如描述的蟒蛇文档中,当蟒蛇