10

与 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
4

5 回答 5

3

通过使用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"
于 2019-09-05T20:52:17.030 回答
2

使用str.format().

最好是明确地向它传递参数。但作为权宜之计,您可以使用locals()将本地(函数定义)变量的字典传递给格式化函数:

foo = 'bar'
print('Foo is actually {foo}'.format(**locals()))

您当然可以复制globals()到本地字典,然后合并locals()到它,并使用它来更接近地模拟 f-string 方法。

于 2017-12-01T17:14:07.070 回答
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
于 2018-04-22T06:24:41.390 回答
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
于 2017-12-01T17:08:28.687 回答
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'
于 2017-12-01T17:17:46.063 回答