Python f 字符串从消息列表中解释

Python f Strings interpret from list of messages

我正在编写一个示例问候程序。我有一个随机的问候消息列表,名称为模板字符串。

我的代码如下

from random import  randint

random_greeting = [
    "Hello {name}, Hope you are doing well",
    "Hello {name}, Hope you are having a great day",
    "Hello {name}, Nice to meet you"
    ]

class Greetings(object):

    global random_greeting

    def read_input(self):
        return input("What is your name? ")

    def print_greeting_rand(self, name):
        greet_length = len(random_greeting)
        random_int = randint(0, greet_length-1)
        message = random_greeting[random_int]
        print(f"{message}") # Here {name} not coming into scope

if __name__ == "__main__":
    greet = Greetings()
    name = greet.read_input()
    greet.print_greeting_rand(name)

所以 random_greeting 有名称为模板字符串的消息列表 {name}。在函数 print_greeting_rand 中,我正在根据随机索引获取问候消息并使用 Python F 字符串进行打印,{name} 未按预期进行解释。

有什么建议吗?

不幸的是,对于 f-strings 你不能这样做,因为它们会被立即评估,所以你可以做的是使用:

from random import choice

random_greeting = [
    "Hello {name}, Hope you are doing well",
    "Hello {name}, Hope you are having a great day",
    "Hello {name}, Nice to meet you"
    ]

def print_greeting_rand(self, name):
    message = choice(random_greeting)
    print(message.format(name=name))

你想要

print(message.format(name=name))

同样的道理也适用于 f 弦。

print(f'{message}'.format(name=name))

您可以利用一个简单的正则表达式和 **kwargs:

import random, re

class Greetings(object):
    greetings = [
        "Hello {name}, Hope you are doing well {when}",
        "Hello {name}, Hope you are having a great day",
        "Hello {name}, Nice to meet you"
    ]
    rx = re.compile(r'{([^{}]+)}')
    vars = {}

    def read_input(self):
        return input("What is your name? ")

    def print_greeting_rand(self, **kwargs):
        self.vars = kwargs
        tmpl = self.rx.sub(self.__replace__, random.choice(self.greetings))
        print(tmpl)

    def __replace__(self, m):
        var = m.group(1)
        if var in self.vars:
            return self.vars[var]
        return m.group(0)


if __name__ == "__main__":
    greet = Greetings()
    greet.print_greeting_rand(name=greet.read_input(), when="today")

解释:

这将扫描字符串以查找 { + variable_name + } 形式的任何变量,并在 **kwargs 参数中找到它时替换它。如果找不到,它只是 returns {variable_name},即保持原样。

查看 regex101.com 上表达式的演示。