python - 如何在方法中的字符串之外使用三引号字符串中定义的参数(使用eval())?
问题描述
我正在使用三引号字符串,在字符串内有 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
解决方案
明白了,你需要在or中使用globals
参数。这允许您传递一个字典,该字典将用作命名变量的初始值,并且它将由评估代码相应地更新并返回。eval
exec
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 -- 这是字典中的初始值
三
100
我希望它足够清楚。
推荐阅读
- javascript - 对textarea中的多行执行更新功能
- ios - 在从 UIActivityController 拒绝保存图像的权限后,如何将用户重定向到设置?
- c - 如何从 Visual Studio 2019 中的不同解决方案链接“.lib”库?
- python - 一系列数字的 Glob 文件
- image - 计算以 300dpi 扫描的字母大小图像的预期文件大小(以千字节为单位)的公式是什么?
- java - 错误:活动类 {com.example.thejourney/com.example.thejourney.WelcomeActivity} 不存在
- python - 如何从 URL 列表中获取属性('innerHTML') - Selenium?
- python - MySQL-Python 代码不起作用,每次我尝试修复时都会产生各种错误
- javascript - 阻止下划线变大
- c++ - 如何修复我的 c++ pythagorean 三重查找器中的“访问冲突读取位置”错误?