我想将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}
我该怎么做?
如果您定义:
然后你可以:
作为输出:
但请注意,用户可以在模板中使用表达式,例如:
你绝对不想要这个!
因此,更安全的选择是定义:
不再可能使用任意代码,但用户仍然可以使用字符串表达式,如:
作为输出:
这在某些情况下可能是需要的。
如果您希望用户能够访问您的命名空间,您可以这样做,但后果完全取决于您。不用f字符串,您可以使用^{} 方法动态插值,语法非常相似。
如果希望用户只访问少量特定变量,可以执行以下操作
当然,您可以将用户输入的密钥重命名为您使用的变量名:
你可以让用户访问你的整个名称空间(或者至少大部分名称空间)。请不要这样做,但请注意您可以:
我使用
print(f'{my_str}')
而不是print(my_str)
的原因是为了避免将文本大括号视为进一步的错误扩展。例如,user_input = 'certi_{{{element}}}'
f"..."
在将表达式结果插入文本时,字符串是很好的,但是没有文本,在单独的变量中有模板字符串。可以使用^{} 将值应用于该模板:
使用名称(例如
{element}
)的字符串格式占位符不是变量。而是为str.format()
调用的关键字参数中的每个名称分配一个值。在上面的例子中,element=value
传递value
变量的值,用element
填充占位符。与
f
-字符串不同,{...}
占位符是而不是表达式,不能在模板中使用任意Python表达式。这是件好事,您不希望最终用户能够在您的程序中执行任意Python代码。有关详细信息,请参见Format String Syntax documenation。您可以传入任意数量的名称;字符串模板没有可以使用其中任何名称。如果将
str.format()
与**mapping
调用约定结合起来,则可以使用任何字典作为值的源:上面将允许用户在模板中使用
template_values
中的任何名称,可以任意次数使用。虽然可以使用
locals()
和globals()
生成将变量名映射到值的字典,但我不建议使用这种方法。使用像上面这样的专用名称空间来限制可用的名称,并为最终用户记录这些名称。相关问题 更多 >
编程相关推荐