3 回答

TA贡献1942条经验 获得超3个赞
您可以利用一个简单的正则表达式和**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上的表达式演示。

TA贡献1871条经验 获得超8个赞
不幸的是,对于 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))

TA贡献1846条经验 获得超7个赞
你要
print(message.format(name=name))
这同样适用于 f 弦。
print(f'{message}'.format(name=name))
添加回答
举报