使用以下模式是否有任何缺点,警告或不良做法警告?
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)
答案 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)
这是非常古老的,但是如果你发现自己使用return Book.find({ id });
,我在传递.format
时遇到的一个警告是,如果你没有在任何地方定义该变量,它就会破坏。明确说明传入的变量将在大多数现代IDE中避免这种情况。
**locals