对于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) 

4 Solutions collect form web for “对于string使用locals()和format()方法:是否有任何警告?”

现在有一个正式的方法来做到这一点,从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> 
  • 在Matlab中使用i和j作为variables
  • 为什么我的$ _ENV是空的?
  • 在创build它们的函数中使用全局variables
  • 如何为log4net指定通用的应用程序数据文件夹?
  • parameter passing策略 - 环境variables与命令行
  • TSQL定义临时表(或表variables)没有定义架构?
  • 在WebGL中,属性,统一和variables之间有什么区别?
  • Ruby Rspec:testing实例variables而不添加访问者到源
  • Objective C静态类级别variables
  • JavaScript中的静态variables
  • 如何使用JavaScript将键码转换为字符