【问题标题】:How to convert a local variable into global, python?如何将局部变量转换为全局变量,python?
【发布时间】:2018-11-11 14:40:42
【问题描述】:

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

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

myimport('os', 'pax')

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

【问题讨论】:

  • 请不要那样做...... Python 已经有这样的语法:import os as pax
  • 我知道已经有语法了。但也许将来我可能需要做其他事情并遇到同样的问题。我只是想知道我们该怎么做。 :D tq.
  • 但是在这里你基本上违反了两件事:(a)你使用exec(..),它非常不安全并且是软件反模式,第二(b)你的目标是创建一个变量 by名称。如果有人想将其定义为'1''foo bar' 怎么办?以这种方式定义它不会有帮助(最终)。大多数 IDE 也无法帮助处理这种“动态”导入,而且还不清楚是否存在“名称冲突”。
  • 你考虑过使用 importlib 吗?docs.python.org/3/library/…
  • myimport 函数可以与 try-catch 一起使用。我关心的不是导入模块。我只是想知道是否有任何方法可以将未定义的变量名从本地范围转移到全局范围。

标签: python python-2.7 scope


【解决方案1】:

此答案仅用于研究目的,正如 Willem Van Onsem 在评论部分所述 - 由于可能引发的安全问题,通过 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)

【讨论】:

    【解决方案2】:

    您可以将全局字典作为第二个参数传递给exec。这会改变exec的代码执行范围。

    def very_bad_idea(name, value):
        exec(f'{name}={repr(value)}', globals())
    
    very_bad_idea('spam', 'eggs')
    print(spam)  # prints 'eggs'
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多