【问题标题】:Is it possible to import to the global scope from inside a function (Python)?是否可以从函数(Python)内部导入到全局范围?
【发布时间】:2011-09-14 21:51:47
【问题描述】:

我正在尝试从函数内部导入一个模块,并使其可用于我的整个文件,就像我在任何函数之外并且在所有其他代码之前导入时一样。它在函数中的原因是我对脚本的结构没有太多控制。如果不求助于破解 __builtin__ 或在我的代码周围传递我需要的东西,这是否可能?

【问题讨论】:

  • 如果您关心下一个必须阅读您的代码的人(可能是您自己),请不要这样做。听起来您正在以糟糕的组织实践作为糟糕的编码实践的借口;尝试解决根本原因。
  • 我正在修改一个开源项目并尝试更改绝对最低要求。
  • 因此,通过尝试更改必要的最小值,您会让所有其他贡献者难以理解。这是一个糟糕的权衡。
  • 如果由我来决定,我会重组代码的许多部分,但我的老板不希望我这样做。编辑:为了更清楚一点,直到代码中的这一点才知道模块名称,这就是为什么我首先要在此处导入它。在顶部导入并不是我们认为太大的变化。

标签: python import globals


【解决方案1】:

globals()["os"] = __import__("os")? 之类的东西怎么样

如果你愿意的话,我想这可以包装在一个通用函数中,因为模块名称是一个字符串。

【讨论】:

  • 这很好,因为索引可用于模拟不是(我相信)内置于__import__() 的“导入为”行为。事实证明,这并不能解决我的问题,但它确实回答了我提出的问题。
【解决方案2】:

看到你们的新 cmets,我想强调这听起来没有必要。您实际上是通过在函数中导入来修改脚本更多,而不是通过以正常方式在脚本顶部导入。尽管如此,本着回答所提问题的精神,我将留下我之前的答案。


老实说,我不确定这是执行此操作的正确方法,但快速检查确认,如果您在导入之前在函数中将模块名称声明为 global,它会被导入到全局命名空间中。

>>> def import_re():
...     global re
...     import re
... 
>>> re
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 're' is not defined
>>> import_re()
>>> re
<module 're' from '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc'>

除非你真的必须这样做,否则不要这样做——然后用大红字写,可以这么说。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2011-10-28
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2012-02-18
    • 2017-01-20
    相关资源
    最近更新 更多