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

Python f字符串从消息列表中进行解释,python,f-string,Python,F String,我正在编写一个示例问候程序。我有一个随机列表的问候语与模板字符串作为名称 我的代码如下 从随机导入randint 随机问候=[ 你好{name},希望你一切顺利, 你好{name},希望你今天过得愉快, 你好{name},很高兴认识你 ] 类问候对象: 全球随机问候语 def read_inputself: 返回输入你叫什么名字? def print_greeting_randself,姓名: 问候语长度=随机问候语 random_int=randint0,长度为-1 message=rando

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

我的代码如下

从随机导入randint 随机问候=[ 你好{name},希望你一切顺利, 你好{name},希望你今天过得愉快, 你好{name},很高兴认识你 ] 类问候对象: 全球随机问候语 def read_inputself: 返回输入你叫什么名字? def print_greeting_randself,姓名: 问候语长度=随机问候语 random_int=randint0,长度为-1 message=random\u问候语[random\u int] printf{message}此处{name}未进入范围 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 问候 name=greet.read\u输入 greet.print\u greeting\u randname 因此,random_问候语具有名称为模板字符串{name}的消息列表。在函数print_greeting_rand中,我基于随机索引获取问候消息,并使用Python F字符串打印,{name}未按预期进行解释


有什么建议吗?

不幸的是,对于f字符串,您不能这样做,因为它们会立即进行评估,因此您可以使用:

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))

不幸的是,对于f字符串,您无法做到这一点,因为它们会立即求值,因此您可以改为使用:

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))
你想要

printmessage.formatname=name f字符串也是如此

printf'{message}'.formatname=name 你想要

printmessage.formatname=name f字符串也是如此

printf'{message}'.formatname=name
您可以利用简单的正则表达式和**kwargs:

说明:

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


请参阅上的表达式演示。

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

说明:

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



请参阅上表达式的演示。

我不认为你可以用f字符串来实现这一点,除非可能使用一些讨厌的eval hack。您只需执行message.formatname即可=name@alaniwi,是的,你能添加更多关于eval hack的信息吗。请谢谢。@wjandrea,是的,我想我可以用那种方法。@rːdʒre eval,有人在wjandrea链接的页面上发布了一个关于这种效果的答案。但不建议这样做。@Jan我的观点是,在运行时按名称获取变量不可避免地会很麻烦。因此,毫无疑问,你在答案中使用了kwargs字典的原因。我不认为你能用f字符串做到这一点,除非可能用一些讨厌的eval hack。您只需执行message.formatname即可=name@alaniwi,是的,你能添加更多关于eval hack的信息吗。请谢谢。@wjandrea,是的,我想我可以用那种方法。@rːdʒre eval,有人在wjandrea链接的页面上发布了一个关于这种效果的答案。但不建议这样做。@Jan我的观点是,在运行时按名称获取变量不可避免地会很麻烦。因此,答案中使用kwargs字典的原因是毫无疑问的。在新代码中不再推荐使用第一个字典。我建议完全删除旧式格式建议,只保留.format。反对旧式格式的建议。@alaniwi我只是给出options@Harben当选项好时,选项就好了。在这种情况下,第一个选项不好。在新代码中不再推荐第一个选项。我建议完全删除旧样式的格式建议,只保留.format。反对旧式格式的建议。@alaniwi我只是给出options@Harben当选项好时,选项就好了。在这种情况下,第一个选项不好。不要使用f'{message}',这只是增加了一个额外的不必要的步骤。@wjandrea同意。我只是展示了一种从f-stringsDon’t use f{message}的上下文格式化的方法,这只是增加了一个额外的不必要的步骤。@wjandrea同意。我只是展示了一种从f-Strings上下文中格式化的方法。请您解释一下上面的代码可以做什么?特别是关于重复使用的区域。谢谢。@rːdʒa:添加了一个简短的解释。您能解释一下上述代码的作用吗?特别是关于重复使用的区域。谢谢。@rːdʒa:添加了一个简短的解释。