【问题标题】:Python f Strings interpret from list of messages [duplicate]Python f字符串从消息列表中解释[重复]
【发布时间】:2020-11-08 08:33:38
【问题描述】:

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

我的代码如下

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-Strings 进行打印,{name} 未按预期进行解释。

有什么建议吗?

【问题讨论】:

  • 我不认为你可以用 f 字符串来做到这一点(除非可能有一些讨厌的eval hack)。你可以做message.format(name=name)
  • @alaniwi,是的,您能否添加有关eval hack 的更多信息。请。谢谢。
  • @wjandrea,是的,我想我可以使用这种方法。
  • @rɑːdʒɑ re eval,有人在 wjandrea 链接的页面上发布了对此效果的答案。但不推荐。
  • @Jan 我的意思是,在运行时按名称获取变量不可避免地会很麻烦。因此,毫无疑问,您在答案中使用 kwargs 字典的原因。

标签: python f-string


【解决方案1】:

您可以利用一个简单的正则表达式和**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 参数中找到它时替换它。如果没有找到,它会简单地返回{variable_name},即保持原样。

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

【讨论】:

  • 你能解释一下上面的代码会做什么吗?尤其是使用re 的区域。谢谢。
  • @rɑːdʒɑ:添加了一个简短的解释。
【解决方案2】:

不幸的是,使用 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))

【讨论】:

  • 新代码中不再推荐第一个。
  • 我建议完全删除旧式格式建议,并保留.formatPython official docs 建议不要使用旧格式。
  • @alaniwi 我只是提供选项
  • @Harben 选项很好时,选项很好。在这种情况下,第一个选项不好。
【解决方案3】:

你想要

print(message.format(name=name))

f 字符串也是如此。

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

【讨论】:

  • 不要使用f'{message}',那只是增加了一个额外的不必要的步骤。
  • @wjandrea 同意。我只是展示了一种从 f-strings 的上下文格式化的方法
猜你喜欢
  • 2018-09-13
  • 2021-12-05
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2023-03-11
相关资源
最近更新 更多