与string.Template()或其他方法相比,我想使用Python f-string来实现其语法简洁性。但是,在我的应用程序中,字符串是从文件加载的,变量的值只能在以后提供。
如果有一种方法可以调用与字符串定义分开的fstring功能吗?希望下面的代码能更好地解释我希望实现的目标。
a = 5
s1 = f'a is {a}' # prints 'a is 5'
a = 5
s2 = 'a is {a}'
func(s2) # what should be func equivalent to fstring
答案 0 :(得分:2)
使用str.format()
。
最好明确将参数传递给它。但作为权宜之计,您可以使用locals()
将本地(函数定义)变量的dict传递给格式化函数:
foo = 'bar'
print('Foo is actually {foo}'.format(**locals()))
您当然可以将globals()
复制到本地字典,然后将locals()
合并到其中,并使用它来更接近地模拟f字符串方法。
答案 1 :(得分:1)
你可以这样格式化。传入a的可能值字典并将其映射到您的字符串。
dictionary = {
'a':[5,10,15]
}
def func(d):
for i in range(3):
print('a is {{a[{0}]}}'.format(i).format_map(d))
func(dictionary)
打印:
a is 5
a is 10
a is 15
答案 2 :(得分:1)
以下是您要找的内容:
pip install fstring
from fstring import fstring
x = 1
y = 2.0
plus_result = "3.0"
print fstring("{x}+{y}={plus_result}")
# Prints: 1+2.0=3.0
答案 3 :(得分:0)
你走了:
In [58]: from functools import partial
In [59]: def func(var_name, a):
...: return var_name + f' is {a}'
...:
In [60]: f = partial(func, 'a')
In [61]: f(5)
Out[61]: 'a is 5'
答案 4 :(得分:0)
通过使用eval()
并传递locals()
或任何任意dict作为第二个位置locals
参数,您可以使用输入的任意组合动态地动态计算f字符串。
def fstr(fstring_text, locals, globals=None):
"""
Dynamically evaluate the provided fstring_text
"""
locals = locals or {}
globals = globals or {}
ret_val = eval(f'f"{fstring_text}"', locals, globals)
return ret_val
样品用量:
format_str = "{i}*{i}={i*i}"
i = 2
fstr(format_str, locals()) # "2*2=4"
i = 4
fstr(format_str, locals()) # "4*4=16"
fstr(format_str, {"i": 12}) # "10*10=100"
答案 5 :(得分:-1)
您可以像这样使用re.sub
:
def f(string):
frame = inspect.currentframe()
g = frame.f_back.f_globals
l = frame.f_back.f_locals
try:
repl = lambda m: str(eval(m.group(1), g, l))
return re.sub(r'{(.+?)}', repl, string)
finally:
del frame
该函数运行正则表达式替换,该替换通过eval运行后将所有带括号的字符串替换。使用inspect.currentframe(),我们获得了外部(呼叫者)范围。
>>> a = 5
>>> s2 = 'a is {a}'
>>> print f(s2)
a is 5
注意:它可以轻松扩展为处理!r之类的格式标志。