2011-06-14 92 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'> 

不要這樣做,除非你真的必須 - 然後用紅色大寫字母來寫。

相關問題