对于string使用locals()和format()方法:是否有任何警告?
使用以下模式有什么缺点,警告或不良做法警告?
def buildString(user, name = 'john', age=22): userId = user.getUserId() return "Name: {name}, age: {age}, userid:{userId}".format(**locals())
我有一个非常重复的string生成代码来写,并试图使用这个,但有关使用locals()
使我感到不舒服。 这是否有任何意外行为的危险?
编辑:上下文
我发现自己经常写这样的东西:
"{name} {age} {userId} {etc}...".format(name=name, age=age, userId=userId, etc=etc)
现在有一个正式的方法来做到这一点,从Python 3.6.0: 格式化string文字 。
它是这样工作的:
f'normal string text {local_variable_name}'
例如,而不是这些:
"hello %(name)s you are %(age)s years old" % locals() "hello {name}s you are {age}s years old".format(**locals())
只是这样做:
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'
参考:
- Python 3.6新增function
- PEP 498
- 词汇分析描述
如果格式string不是用户提供的,这个用法是可以的。
format
优于使用旧的%
进行stringreplace。
locals
是内置到Python,其行为将是可靠的。
我认为locals
正是你所需要的。
只是不要修改当地人的字典,我会说你有一个很好的解决scheme。
如果格式string是用户提供的,则容易受到各种恶意的注入攻击。
我经常做这样的事情。 我遇到的唯一问题是,当我这样做时, PyFlakes会抱怨未使用的variables 。
这是非常古老的,但是如果你发现自己使用.format
我遇到的一个警告是,如果你没有在任何地方定义的variables,它会打破。 明确指出传入的variables将在大多数现代IDE中避免这种情况。
foo = "bar" "{foo} and {baz} are pair programming".format(**locals) <exception occurs>