57

使用以下模式是否有任何缺点、警告或不良做法警告?

def buildString(user, name = 'john', age=22):
    userId = user.getUserId()
    return "Name: {name}, age: {age}, userid:{userId}".format(**locals())

我有一个非常重复的字符串生成代码要编写并且很想使用它,但是关于使用的一些事情locals()让我感到不舒服。这是否有任何意外行为的危险?

编辑:上下文

我发现自己经常写这样的东西:

"{name} {age} {userId} {etc}...".format(name=name, age=age, userId=userId, etc=etc)
4

3 回答 3

39

从 Python 3.6.0 开始,现在有一种官方方法可以做到这一点:格式化字符串文字

它是这样工作的:

f'normal string text {local_variable_name}'

例如,而不是这些:

"hello %(name) you are %(age) years old" % locals()
"hello {name} you are {age} years old".format(**locals())
"hello {name} you are {age} years old".format(name=name, age=age)

这样做:

f"hello {name} you are {age} years old"

这是官方的例子:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'

参考:

于 2017-06-08T17:48:18.363 回答
30

如果格式字符串不是用户提供的,那么这种用法是可以的。

format优于使用旧%的字符串替换。
locals是 Python 内置的,它的行为将是可靠的。

我认为locals正是你需要的。
只是不要从当地人那里修改字典,我会说你有一个很好的解决方案。

如果格式字符串是用户提供的,那么您很容易受到各种不良的注入攻击。

于 2012-08-01T18:07:47.867 回答
2

Python 3.6 之前的答案

这已经很老了,但是如果您发现自己使用.format了我在传入时遇到的一个警告,**locals那就是如果您没有在任何地方定义该变量,它将中断。在大多数现代 IDE 中,明确说明传入的变量将避免这种情况。

foo = "bar"
"{foo} and {baz} are pair programming".format(**locals())
<exception occurs>
于 2017-09-29T15:53:30.513 回答