gpt4 book ai didi

python - 如何在方法中的字符串外部使用三引号字符串(使用 eval())中定义的参数?

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:08 24 4
gpt4 key购买 nike

我使用三引号字符串,字符串内有 if-else 条件,并根据条件定义变量的值,我无法在字符串之外使用该变量。

我尝试在三重引号字符串内编写整个类,并且它有效,我可以在三重引号字符串之外使用变量。

当整个类都在三重引号内时,它会工作,它会打印变量“a”:

import pystache

codeBlock = '''
class GetData():
def foo():
a = 0
if({{c}} == 5):
a = {{d}} * 5;
elif({{c}} >= 5 and {{c}} < 10):
a = {{d}} * 4;
elif({{c}}<5):
a = {{d}} * 10;

return a

'''

codeBlock1 = pystache.render(codeBlock, {'c': 3,'d':10})
compiledCodeBlock = compile(codeBlock1, '<string>', 'exec')
eval(compiledCodeBlock)
print(GetData.foo())

output:
>python a.py runserver
>100

我想要的是,在以下情况下,当代码块不包含整个类本身时,要打印变量“a”:(我不确定这是否可能)

import pystache
class GetData():
def foo():
a = 0
codeBlock = '''
if({{c}} == 5):
print('one');
a = {{d}} * 5;
elif({{c}} >= 5 and {{c}} < 10):
print('two');
a = {{d}} * 4;
elif({{c}}<5):
print('three');
a = {{d}} * 10;
'''
codeBlock1 = pystache.render(codeBlock, {'c': 3,'d':10})
compiledCodeBlock = compile(codeBlock1, '<string>', 'exec')
eval(compiledCodeBlock)
print(a) # results -> 0

print(GetData.foo()) # results -> None

Output:
>python b.py runserver
>three
>0
>None

预期输出:

a 的值,即100

最佳答案

明白了,您需要在 evalexec 中使用 globals 参数。这允许您传递一个字典,该字典将用作命名变量的初始值,并且它将通过评估的代码进行相应更新并返回。

class GetData():
def foo():
a = 0
codeBlock = '''
if({c} == 5):
print('one');
a = {d} * 5;
elif({c} >= 5 and {c} < 10):
print('two');
a = {d} * 4;
elif({c}<5):
print('three');
a = {d} * 10;
'''
codeBlock1 = codeBlock.format(c=3,d=10)
compiledCodeBlock = compile(codeBlock1, '<string>', 'exec')
loc = {'a':0}
eval(compiledCodeBlock, loc)
#print(loc['a']) # results -> 100
return loc['a']

print(GetData.foo()) # results -> 100

所以你可以看到我正在创建一个字典loc = {'a':0},其中包含一个a“变量”。它被传递给 eval 并与代码中使用的变量相关联。所以如果你这样做:

codeBlock = '''
print(a);

'''

输出为

0 --this is initial value in the dictionary

three

100

我希望它足够清楚。

关于python - 如何在方法中的字符串外部使用三引号字符串(使用 eval())中定义的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com