对字符串使用locals()和format()方法:有什么警告吗?

时间:2012-08-01 17:59:40

标签: python string-formatting local-variables locals

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

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 个答案:

答案 0 :(得分:29)

如果格式字符串不是用户提供的,则此用法是可以的。

format比使用旧%进行字符串替换更受青睐 locals内置于Python,其行为可靠。

我认为locals完全符合您的需要 只是不要修改当地人的字典,我会说你有一个很好的解决方案。

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

答案 1 :(得分:24)

现在有一种正式的方法可以做到这一点,从Python 3.6.0开始:formatted string literals

它的工作原理如下:

f'normal string text {local_variable_name}'

E.g。而不是这些:

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

这样做:

f"hello {name}s you are {age}s 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'

参考:

答案 2 :(得分:8)

我经常这样做。我遇到的唯一问题是PyFlakes will complain about unused variables当我这样做时。

答案 3 :(得分:1)

Pre Python 3.6回答

这是非常古老的,但是如果你发现自己使用return Book.find({ id }); ,我在传递.format时遇到的一个警告是,如果你没有在任何地方定义该变量,它就会破坏。明确说明传入的变量将在大多数现代IDE中避免这种情况。

**locals