Python 如何在字符串中动态更改变量的值?
我从文本e-gPython 如何在字符串中动态更改变量的值?,python,Python,我从文本e-gs=“a&(b | c)”中提取了一个数学字符串,我想使用eval(s),但在此之前,我必须为变量赋值,比如: a, b, c = somefuction() 我如何动态地这样做 r = re.findall("\w+", s) r[0], r[1], r[2] = somefunction() 然后将这些值传递回变量,并对其使用eval()。 基于a、b、c的值,我的最终输出应该给出True或False,假设findall正确地找到了变量,并且函
s=“a&(b | c)”
中提取了一个数学字符串,我想使用eval(s)
,但在此之前,我必须为变量赋值,比如:
a, b, c = somefuction()
我如何动态地这样做
r = re.findall("\w+", s)
r[0], r[1], r[2] = somefunction()
然后将这些值传递回变量,并对其使用eval()
。
基于a、b、c的值,我的最终输出应该给出True或False,假设
findall
正确地找到了变量,并且函数返回了相应的元组,那么您可以使用exec
设置变量:
r = re.findall("\w+", s)
vars = ', '.join(r)
exec(vars + ' = somefunction()')
在您的示例中,这将构造字符串a,b,c=somefunction()
,并执行它,从而在当前名称空间中设置变量
由于在注释中您声明变量的数量可能不同,因此您可能希望将该数量发送到函数:
exec('{} = somefunction({})'.format(vars, len(r)))
或者,如果函数总是返回相同数量的元素,但根据提取的数学表达式,可能无法使用一个或多个元素,则可能需要在
vars
字符串中附加或前置(下划线),以取代未使用的值。使用dict代替变量,从
这是我发现的最好的方法,但我相信它可以更短:
import re
s = "a&(b|c)"
sometuple = 7, 1, 2 # Stand-in for "somefunction()"
names = re.findall(r"\w+", s)
vals = {name: val for name, val in zip(names, sometuple)} # Map names to values
# > {'a': 7, 'b': 1, 'c': 2}
s_spec = re.sub(r"(\w+)", r'{\1}', s) # Mark names for interpolation
# > '{a}&({b}|{c})'
filled = s_spec.format(**vals) # Interpolate
# > '7&(1|2)'
print(eval(filled)) # -> 3
如果使用
eval()
,它通常只使用本地名称空间中的任何变量。如果您在调用eval()
之前分配了名为a
、b
和c
的变量,那么它应该使用它们的当前值。@问题是,我正在从文本中提取该字符串。稍后我必须使用somefunction分配值。您可能希望使用re.sub()
将它们替换为,比如说,{}
,然后使用str.format()
替换所需的值。如果不知道你的输入是什么样子,输出应该是什么样子,就不可能给出更全面的答案。@greencapegy好主意,让我试试。我希望有一种更简单的python方法。你对变量了解多少?你知道有多少,或者是动态变化的吗?您能否保证它们是提取字符串中唯一的字母字符(即“\w+”将正确提取)?