这不是重复的,因为这涉及使用较新的 str.format()
,上面链接的问题也质量较低, 我认为这个问题足以证明其规范性。
问题:
这里可能会出现错误,但我们可以为 str.format
方法提供未使用的关键字参数。
>>> '{a}{b}'.format(a='foo', b='bar', c='baz')
'foobar'
这会启用如下代码:
>>> foo = 'bar'
>>> baz = 'fizzbuzz'
>>> '{foo}{baz}'.format(**locals())
'barfizzbuzz'
>>> baz = datetime.datetime.now()
>>> '{foo}_{baz}'.format(**locals())
'bar_2013-12-20 18:36:55.624000'
在像函数一样的闭包中这样做是一个好习惯吗?
def make_foo_time_string():
foo = 'bar'
baz = datetime.datetime.now()
return '{foo}{baz}'.format(**locals())
可能的缺点是什么?使用额外的循环加载额外的变量?这是为了方便吗? 我不记得看到过这种用法,它会被认为是 Python 的惯用语吗?
更新我发现了一个使用旧式字符串插值的规范建议用法:https://wiki.python.org/moin/PythonSpeed/PerformanceTips不过,这似乎是一个相当古老的文件。
"Even better, for readability (this has nothing to do with efficiency other than yours as a programmer), use dictionary substitution:"
out = "<html>%(head)s%(prologue)s%(query)s%(tail)s</html>" % locals()
What would be the possible downsides? Extra variables loaded using extra cycles? Is this a matter of convenience? I don't recall seeing this used much, would it be considered idiomatic of Python?
你只是遇到了最大的缺点:这不是惯用的。
而 原因 它不是惯用的,因为 Zen说,“显式优于隐式。”
显然很多人不会写 '{foo}{baz}'.format(foo=foo, baz=baz)
(尤其是当你超过 2 个变量时),因为这违反了DRY 非常可怕......但是有一种方法可以做到这一点,它与您的代码一样简洁,至少同样明确,并且不需要像 locals
这样的高级知识:
>>> '{}{}'.format(foo, baz)
当格式字符串是动态的时,这不起作用,但这是一个好的事情,因为动态格式字符串通常是一个危险信号。
(有些人还争辩说这里的“静态检查”好处——如果将名称嵌入格式字符串中,与使用变量的简单 NameError
相比,您得到的可破译错误要少得多format
的参数中不存在。我把它放在底部附近的括号中,因为我个人认为这个参数不是很好,即使我已经多次看到它......)
然而,与任何风格/习语问题一样,在这个问题上并没有普遍的共识,并且在 python-list(和 python-ideas,当有人提出一种制作 locals()
format
等的默认值),直到每个人都不再关注。
我是一名优秀的程序员,十分优秀!