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 上表达式的演示。
我正在编写一个示例问候程序。我有一个随机的问候消息列表,名称为模板字符串。
我的代码如下
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 上表达式的演示。