我发现了这种模式(或反模式),我对它非常满意。
我觉得它很敏捷:
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匹配位置在元组内。
你喜欢它吗?你会/你会用它吗?是/否,请解释。答案 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>)
具有
我倾向于支持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'
参考: