在函数内部是否可以将变量导入到全局作用域中(Python)?

15
我尝试从函数内部导入一个模块,并且希望它可以像在函数外部导入一样对整个文件可用。由于我没有太多控制脚本的结构,所以这个模块在一个函数中。是否可能做到这一点,而不需要像修改__builtin__或者将需要的东西传递给我的代码那样采取某些手段?

2
如果你在意下一个需要阅读你代码的人(很可能是你自己),就不要这样做。听起来你是在用糟糕的组织实践作为糟糕编码实践的借口;试着解决根本原因。 - msw
2
我正在修改一个开源项目,并尝试更改绝对必要的最小部分。 - scott77777
3
尝试改变最低限度的话,会让其他贡献者无法理解,这是一个很不划算的交换。 - msw
2
如果由我来说,我会重构代码的许多部分,但我的老板不想让我这样做。编辑:为了更清晰一些,模块名称在代码中的这个点之前是未知的,这就是为什么我首先要在这里导入它的原因。在顶部导入并不被认为是太大的变化。 - scott77777
2个回答

11

你觉得这种方式怎么样:globals()["os"] = __import__("os")?

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


这很好,因为索引可以用来模拟“导入为”行为,而这不是(我相信)内置到__import __()中的。结果证明,这并没有解决我的问题,但它确实回答了我提出的问题。 - scott77777

10
看到你的新评论,我想强调这听起来是不必要的。实际上,通过在函数内部导入而不是以正常方式在脚本顶部导入,你实际上会对脚本进行更多修改。尽管如此,为了回答提出的问题,我仍然保留之前的答案。
老实说,我不确定这是否是正确的做法,但快速检查确认,如果在函数内先将模块名称声明为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'>

除非你真的必须这样做,否则不要这样做——就像用大红字写出来一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接