Python:使用“..%(var)s ..”%locals()是一个好习惯吗?

时间:2009-10-11 11:27:39

标签: python string design-patterns anti-patterns

我发现了这种模式(或反模式),我对它非常满意。

我觉得它很敏捷:

def example():
    age = ...
    name = ...
    print "hello %(name)s you are %(age)s years old" % locals()

有时我会使用它的堂兄:

def example2(obj):
    print "The file at %(path)s has %(length)s bytes" % obj.__dict__

我不需要创建一个人工元组并计算参数并保持%s匹配位置在元组内。

你喜欢它吗?你会/你会用它吗?是/否,请解释。

7 个答案:

答案 0 :(得分:87)

答案 1 :(得分:10)

我认为这是一个很好的模式,因为您正在利用内置功能来减少您需要编写的代码。我个人觉得它很像Pythonic。

我从不编写我不需要编写的代码 - 更少的代码比更多的代码更好,例如,使用locals()的这种做法允许我编写更少的代码,并且也非常容易阅读和理解

答案 2 :(得分:10)

从未在一百万年。目前还不清楚格式化的上下文是什么:locals几乎可以包含任何变量。 self.__dict__并不含糊。非常糟糕的是让未来的开发人员对本地和非本地的东西感到头疼。

这是一个故意的谜。为什么要让您的组织承担这样的未来维护难题?

答案 3 :(得分:10)

关于“表兄”而不是obj.__dict__,新字符串格式看起来好多了:

def example2(obj):
    print "The file at {o.path} has {o.length} bytes".format(o=obj)

我对 repr 方法使用了很多,例如

def __repr__(self):
    return "{s.time}/{s.place}/{s.warning}".format(s=self)

答案 4 :(得分:8)

"%(name)s" % <dictionary>甚至更好,"{name}".format(<parameters>)具有

的优点
  • 比“%0s”更具可读性
  • 独立于参数顺序
  • 不强迫使用字符串
  • 中的所有参数

我倾向于支持str.format(),因为它应该是在Python 3中执行此操作的方式(根据PEP 3101),并且已经可以从2.6获得。但是使用locals(),你必须这样做:

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

答案 5 :(得分:6)

使用内置的vars([object])documentation)可能会让第二眼看起来更好:

def example2(obj):
    print "The file at %(path)s has %(length)s bytes" % vars(obj)

效果当然是一样的。

答案 6 :(得分:1)

现在有一种正式的方法可以做到这一点,从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} you are {age} years old".format(**locals())
"hello {} you are {} years old".format(name, 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'

参考: