首页 > 解决方案 > 如何在方法中的字符串之外使用三引号字符串中定义的参数(使用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

标签: pythondjangovariablesscope

解决方案


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

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

我希望它足够清楚。


推荐阅读