Как преобразовать локальную переменную в глобальную Python? - PullRequest
0 голосов
/ 11 ноября 2018

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

def myimport(modulename, newname):
    exec('%s = __import__("%s")'%(newname, modulename))

myimport('os', 'pax')

теперь переменная pax не может быть доступна вне функции, и я хочу, чтобы она была доступна.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

В качестве второго аргумента вы можете передать в глобальный словарь exec. Это изменит область выполнения кода exec.

def very_bad_idea(name, value):
    exec(f'{name}={repr(value)}', globals())

very_bad_idea('spam', 'eggs')
print(spam)  # prints 'eggs'

Но, пожалуйста, не делай этого. Попробуйте найти способ, который не включает exec.

0 голосов
/ 11 ноября 2018

Этот ответ только для исследовательских целей, как заявил Виллем Ван Онсем в разделе комментариев - импорт через eval / exec и т. Д. Не является значительным в производительном коде из-за проблем безопасности, которые он может вызвать.Следующий код работает с python 2 и python 3. Хитрость заключается в том, чтобы использовать функцию global () для привязки импортированного модуля к глобальной переменной:

def myimport(modulename):
    module = eval('__import__("%s")' % (modulename))
    globals()[modulename] = module

myimport('os')
print(os.path) # now os can get used ...

Обновление

Следующий код работает без этого уродливого оператора eval:

def myImport(modulename):
    globals()[modulename] = __import__(modulename)

myImport("sys")
print(sys.path)
...