如何将局部变量转换为全局python?

时间:2018-11-11 14:40:43

标签: python python-2.7 scope

我创建了一个函数,该函数将python中的模块作为您想要的名称导入。我只想知道如何在全局范围内访问此新局部变量。

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

myimport('os', 'pax')

现在 pax 变量无法在函数外部访问,我希望可以访问它。

2 个答案:

答案 0 :(得分:1)

正如威廉姆·范·昂塞姆(Willem Van Onsem)在评论部分中所述,此答案仅用于研究目的-由于可能会引发安全性问题,因此通过eval / exec等导入在生产性代码中并不重要。以下代码适用于python 2和python3。技巧是使用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)

答案 1 :(得分:0)

您可以将globals词典作为exec的第二个参数传递。这将更改exec的代码执行范围。

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

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

但是请不要这样做。尝试找到不涉及exec的方式。

相关问题