3 回答

TA贡献1802条经验 获得超4个赞
f"..."将表达式结果插入到文字中时,字符串非常有用,但是您没有文字,而是在单独的变量中有一个模板字符串。
您可以使用str.format()将值应用于该模板:
name=["deep","mahesh","nirbhay"]
user_input = "certi_{element}" # this string i ask from user
for value in name:
print(user_input.format(element=value))
使用名称(例如{element})的字符串格式化占位符不是变量。您可以为str.format()调用的关键字参数中的每个名称分配一个值。在上面的示例中,element=value传入value变量的值以使用element.
与f-strings不同,{...}占位符不是表达式,您不能在模板中使用任意 Python 表达式。这是一件好事,您不希望最终用户能够在您的程序中执行任意 Python 代码。有关详细信息,请参阅格式字符串语法文档。
您可以传入任意数量的名称;字符串模板不具有使用其中任何一个。如果你把str.format()与**mapping调用约定,你可以使用任何字典作为价值的源泉:
template_values = {
'name': 'Ford Prefect',
'number': 42,
'company': 'Sirius Cybernetics Corporation',
'element': 'Improbability Drive',
}
print(user_input.format(**template_values)
以上将允许用户使用template_values他们模板中的任何名称,他们喜欢的次数不限。
虽然您可以使用locals()和globals()生成将变量名称映射到值的字典,但我不推荐这种方法。使用像上面这样的专用命名空间来限制可用的名称,并为您的最终用户记录这些名称。

TA贡献2003条经验 获得超2个赞
如果你定义:
def fstr(template):
return eval(f"f'{template}'")
然后你可以这样做:
name=["deep","mahesh","nirbhay"]
user_input = r"certi_{element}" # this string i ask from user
for element in name:
print(fstr(user_input))
作为输出给出:
certi_deep
certi_mahesh
certi_nirbhay
但请注意,用户可以在模板中使用表达式,例如:
import os # assume you have used os somewhere
user_input = r"certi_{os.environ}"
for element in name:
print(fstr(user_input))
你绝对不想要这个!
因此,更安全的选择是定义:
def fstr(template, **kwargs):
return eval(f"f'{template}'", kwargs)
任意代码不再可能,但用户仍然可以使用字符串表达式,例如:
user_input = r"certi_{element.upper()*2}"
for element in name:
print(fstr(user_input, element=element))
作为输出给出:
certi_DEEPDEEP
certi_MAHESHMAHESH
certi_NIRBHAYNIRBHAY
在某些情况下这可能是需要的。

TA贡献1993条经验 获得超5个赞
如果您希望用户能够访问您的命名空间,您可以这样做,但后果完全由您承担。除了使用 f-strings,您还可以使用该format方法以非常相似的语法进行动态插值。
如果您希望用户只能访问少数特定变量,您可以执行以下操作
name=["deep", "mahesh", "nirbhay"]
user_input = "certi_{element}" # this string i ask from user
for element in name:
my_str = user_input.format(element=element)
print(f"{my_str}")
您当然可以重命名用户输入的键与您使用的变量名称:
my_str = user_input.format(element=some_other_variable)
你可以让用户访问你的整个命名空间(或至少大部分)。请不要这样做,但请注意,您可以:
my_str = user_input.format(**locals(), **globals())
我使用print(f'{my_str}')而不是的原因print(my_str)是为了避免文字大括号被视为进一步的错误扩展的情况。例如,user_input = 'certi_{{{element}}}'
添加回答
举报