Python 通过访问变量从字符串执行脚本?
我有一个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
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,则会创建一个全局字典={},该字典在调用函数后将被丢弃。