2011-06-14 10 views
8

Я пытаюсь импортировать модуль изнутри функции и иметь его доступным для всего моего файла так же, как если бы я импортировал вне любых функций и перед всем другим кодом. Причина, по которой это происходит в функции, заключается в том, что у меня нет большого контроля над структурой скрипта. Возможно ли это, не прибегая к таким вещам, как взлом __builtin__ или передача того, что мне нужно во всем моем коде?Можно ли импортировать в глобальную область изнутри функции (Python)?

+2

Не делайте этого, если вас беспокоит следующий человек, который должен прочитать ваш код (возможно, вы сами). Похоже, вы используете плохую организационную практику в качестве предлога для плохой практики кодирования; попытайтесь исправить первопричину. – msw

+1

Я изменяю проект с открытым исходным кодом и пытаюсь изменить необходимый абсолютный минимум. – scott77777

+3

Итак, пытаясь изменить необходимый минимум, вы сделаете его непонятным для всех других участников. Это плохой компромисс. – msw

ответ

9

Как о чем-то вроде globals()["os"] = __import__("os")?

Я думаю, это может быть завернуты в родовой функции, если вы хотите, так как имя модуля является строкой.

+0

Это хорошо, потому что индекс может использоваться для эмуляции поведения «import as», который не является (я считаю) встроенным в '__import __()'. Оказывается, это не решает мою проблему, но отвечает на вопрос, который я задал. – scott77777

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'> 

Не делайте этого, если вам действительно не нужно - и затем пишите его большими красными буквами, так сказать.

Смежные вопросы