Python fstring作为函数

时间:2017-12-01 16:49:03

标签: python string f-string

与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

6 个答案:

答案 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之类的格式标志。