通过访问变量从字符串执行脚本?

时间:2018-11-19 19:18:47

标签: python python-3.x global-variables exec

我有一个python脚本作为字符串,例如:

exec("sent = {'test': 1}")
global sent
print(sent)

我使用exec函数执行了它,然后使用global python命令访问了变量。这种方法可以在不使用类的情况下正常工作,但是当我在类中具有相同的代码时,例如:

class example:
    def fun1(self):
        exec("sent = {'test': 1}")
        global sent
        print(sent)

v = example()
print(v.fun1())

我收到以下错误:

NameError: name 'sent' is not defined

2 个答案:

答案 0 :(得分:1)

您确实应该避免使用全局变量。无论如何,这是如何做:

class example:
    def fun1(self):
#        globals sent  # Not needed in this special case.
        exec("sent = {}", globals())
        print('in fun1, "sent" is now', sent )


v = example()
print(v.fun1())  # Result will be None because fun1() doesn't return anything.
print('after call to fun1(), global "sent" is', sent)

输出:

in fun1, "sent" is now {}
None
after call to fun1(), global "sent" is {}

global声明仅在函数或类方法内执行某项操作,甚至在将全局变量的值设置为某项时才需要。 但是,作为一种特殊情况,fun1()方法中实际上并不需要一个,因为它在调用globals()时显式传递了exec()(但不是一个单独的本地字典)。无论如何都要放一个以使之更清楚是一个好主意。

documentation中说明了使用exec()的方式:

  

如果仅提供全局变量,则必须为字典,将同时用于 全局变量和局部变量。

(重点是我的)

这是一种避免在该方法中完全引用全局变量的方法:

class example:
    def fun1(self):
        namespace = {}
        exec("sent = {}", namespace)
        sent = namespace['sent']  # Retrieve result.
        print('in fun1, "sent" is now', sent )
        return sent

v = example()
sent = v.fun1()
print('after calling fun1(), "sent" got set to', sent)

输出:

in fun1, "sent" is now {}
after calling fun1(), "sent" got set to {}

答案 1 :(得分:1)

您没有通过全局词典进行修改。试试:

 exec("sent = {}",globals())