2011-06-14 85 views
8

我想从一个函数内部导入一个模块,并让它可用于我的整个文件,就像我在外部导入任何函数之前以及在所有其他代码之前一样。它在函数中的原因是因为我对脚本的结构没有太多的控制。这是可能的,而不诉诸于黑客__builtin__或传递我所需要的全部代码?是否可以从函数(Python)中导入到全局范围?

+2

不要这样做,如果你关心下一个必须阅读你的代码的人(可能是你自己)。听起来你正在使用糟糕的组织实践作为糟糕的编码实践的借口;尝试解决根本原因。 – msw 2011-06-14 17:35:17

+1

我正在修改一个开源项目并尝试更改必要的绝对最小值。 – scott77777 2011-06-14 17:36:26

+3

所以通过尝试改变必要的最低限度,你会让所有其他贡献者感到难以理解。这是一个糟糕的折衷。 – msw 2011-06-14 17:43:53

回答

9

如何像globals()["os"] = __import__("os")?

我想这一点,如果你想因为模块名称是一个字符串可以被包裹在一个通用的功能。

+0

这是很好的,因为索引可以用来模拟“import import”行为,而不是(我相信)内置到'__import __()'中。事实证明,这并不能解决我的问题,但它确实回答了我问的问题。 – scott77777 2011-06-14 18:10:10

7

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


我诚实不能肯定这是做了正确的方式,但快速检查确认,如果你在导入之前的函数内声明模块名作为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'> 

不要这样做,除非你真的必须 - 然后用红色大写字母来写。

相关问题