为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 f-string 与变量一起使用,而不是与字符串文字一起使用?

如何将 f-string 与变量一起使用,而不是与字符串文字一起使用?

达令说 2021-10-19 16:58:13
我想将 f-string 与我的字符串变量一起使用,而不是使用字符串文字定义的字符串,"...".这是我的代码:name=["deep","mahesh","nirbhay"]user_input = r"certi_{element}" # this string I ask from user  for element in name:    print(f"{user_input}")此代码提供输出:certi_{element}certi_{element}certi_{element}但我想要:certi_{deep}certi_{mahesh}certi_{nirbhay}我怎样才能做到这一点?
查看完整描述

3 回答

?
慕虎7371278

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()生成将变量名称映射到值的字典,但我不推荐这种方法。使用像上面这样的专用命名空间来限制可用的名称,并为您的最终用户记录这些名称。


查看完整回答
反对 回复 2021-10-19
?
湖上湖

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

在某些情况下这可能是需要的。


查看完整回答
反对 回复 2021-10-19
?
ibeautiful

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}}}'


查看完整回答
反对 回复 2021-10-19
  • 3 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号