Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过访问变量从字符串执行脚本?_Python_Python 3.x_Global Variables_Exec - Fatal编程技术网

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

Python 通过访问变量从字符串执行脚本?,python,python-3.x,global-variables,exec,Python,Python 3.x,Global Variables,Exec,我有一个python脚本作为字符串,例如: exec("sent = {'test': 1}") global sent print(sent) 我使用exec函数执行它,然后使用globalpython命令访问变量。这种方法在不使用类的情况下工作没有问题,但是当我在一个类中有相同的代码时,例如: class example: def fun1(self): exec("sent = {'test': 1}") global sent p

我有一个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())
我得到以下错误:

name错误:未定义名称“sent”

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

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)
输出:

在fun1中,“sent”现在是{}
没有一个
在调用fun1()之后,全局“sent”是{}
global
声明仅在函数或类方法内部执行某些操作,并且仅当全局变量的值要设置为某个值时才需要执行。 但是,作为一种特殊情况,在
fun1()
方法中实际上不需要一个函数,因为它在调用
exec()
时显式地传递
globals()
(但不是单独的局部dict)。无论如何,放一个进去,让事情变得更清楚可能是个好主意

使用
exec()
这种方式的解释如下:

如果只提供globals,则它必须是一个字典,用于全局变量和局部变量

(强调矿山)

以下是一种避免在方法中引用全局变量的方法:

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)
输出:

在fun1中,“sent”现在是{}
调用fun1()后,“sent”设置为{}

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

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)
输出:

在fun1中,“sent”现在是{}
没有一个
在调用fun1()之后,全局“sent”是{}
global
声明仅在函数或类方法内部执行某些操作,并且仅当全局变量的值要设置为某个值时才需要执行。 但是,作为一种特殊情况,在
fun1()
方法中实际上不需要一个函数,因为它在调用
exec()
时显式地传递
globals()
(但不是单独的局部dict)。无论如何,放一个进去,让事情变得更清楚可能是个好主意

使用
exec()
这种方式的解释如下:

如果只提供globals,则它必须是一个字典,用于全局变量和局部变量

(强调矿山)

以下是一种避免在方法中引用全局变量的方法:

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)
输出:

在fun1中,“sent”现在是{}
调用fun1()后,“sent”设置为{}

您没有传递要修改的全局字典。尝试:

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

您没有传递要修改的全局字典。尝试:

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

Try:exec(“全局发送;发送={}”)。如果可以的话,请避免使用全局变量。我不能在字符串中添加“global”,因为它太长了?字符串在Python中几乎可以是任何长度。它是一个数据集,有人用代码格式构建它。。“虚拟方式”Try:exec(“全局发送;发送={}”)。如果可以的话,请避免使用全局变量。我不能在字符串中添加“global”,因为它太长了?字符串在Python中几乎可以是任何长度。它是一个数据集,有人用代码格式构建它。。“dummy way”不起作用,它打印“None.”关于“你真的应该避免使用全局变量”,在这种情况下有什么替代方法?Ghanem:我认为现在可以了,很抱歉。使用全局变量的替代方法完全取决于你在做什么。最常见的方法是将它们作为参数传递给函数/方法(如果它们有可变值)。另一种方法是通过
return
将它们从函数/方法中删除。即
sent=v1.fun1()
(假设您在方法的末尾也放了
return-sent
语句)。它不起作用,它会打印“无”。关于:“您真的应该避免使用全局变量”,这种情况下的替代方案是什么?Ghanem:我认为现在可以了,对此表示抱歉。使用全局变量的替代方案完全取决于您正在做什么。最常见的方法是将它们作为参数传递给函数/方法(如果它们有可变值)。另一种方法是通过
return
将它们从函数/方法中删除。即
sent=v1.fun1()
(假设您在方法末尾也放了
return-sent
语句)。为了澄清问题,我在“sent”后面加了一个值变量原始问题试图将“send”初始化为空数组。这样做。您也可以将“send”设置为给定字典,如:exec(“sent={test':1}”,globals())修改的问题中所述,或者修改以前定义为global:exec的字典(“my_global_dictionary['new_key']='new_value'”,global())但添加第二个参数时,对全局字典的引用是至关重要的。如果不添加此exec将创建一个全局字典={},该字典在调用函数后将被丢弃。为了澄清问题,我在“sent”后面加了一个值变量原始问题试图将“send”初始化为空数组。这样做。您也可以将“send”设置为给定字典,如:exec(“sent={test':1}”,globals())修改的问题中所述,或者修改以前定义为global:exec的字典(“my_global_dictionary['new_key']='new_value'”,global())但添加第二个参数时,对全局字典的引用至关重要。如果不添加此exec,则会创建一个全局字典={},该字典在调用函数后将被丢弃。