代码之家  ›  专栏  ›  技术社区  ›  lmiguelvargasf

是否可以像使用字符串和格式一样重用f字符串?

  •  2
  • lmiguelvargasf  · 技术社区  · 6 年前

    我想创建一个f字符串,它可以多次用作以下代码 format

    TEXT_AMOUNT = 'text {amount}'
    
    
    def f1(beginning):
        return beginning + TEXT_AMOUNT.format(amount=10)
    
    
    def f2(ending):
        return TEXT_AMOUNT.format(amount=100) + ending
    

    如何使用f字符串实现相同的功能?我试过:

    TEXT_AMOUNT = f'text {amount}'
    
    
    def f1(beginning):
        amount = 100
        return beginning + TEXT_AMOUNT
    
    
    def f2(ending):
        amount = 10
        return TEXT_AMOUNT + ending
    

    但是,我得到以下错误:

    NameError: name 'amount' is not defined
    
    1 回复  |  直到 6 年前
        1
  •  11
  •   abarnert    6 年前

    你不能。

    一个f字符串不是一种字符串,它是一种字符串文本,它被立即计算。不能将f字符串存储在以后要计算的变量中,也不能接受用户的f字符串,等等。

    那么,如果你 str.format .

    有时,您需要像f字符串那样捕获所有的局部变量和全局变量,但是要显式地这样做。因为这是一个罕见的案例(可能是一个安全漏洞),所以故意有点难看:

    TEXT_AMOUNT = 'text {amount}'
    
    def f1(beginning):
        amount = 100
        return beginning + TEXT_AMOUNT.format(**locals(), **globals())
    

    globals 在这里,对吗?所以别说了。它也会向读者发出信号 locals ,他们会希望看到字符串实际上是源代码中的常量,不会做任何危险的事情。


    1嗯,你呢 能够 在传递给的字符串中使用f字符串 eval

        2
  •  7
  •   bd2357    5 年前

    但是你可以把f-string放在一个函数中,这样就可以重用它

    def TEXT_AMOUNT(amount):
        return f'text {amount}'
    
    def f1(beginning):
        return beginning + " " + TEXT_AMOUNT(amount=10)
    
    def f2(ending):
        return TEXT_AMOUNT(amount=100) + " " + ending
    
    print(f1("first"))
    print(f2("last"))
    

    第一个文本10

    最后100个文本

        3
  •  6
  •   Vespertilio    5 年前

    您可以将其存储为 lambda 功能:

    TEXT_AMOUNT = lambda amount: f'text {amount}'
    print(TEXT_AMOUNT(10))
    
    out: 'text 10'