gpt4 book ai didi

python - 使用 Python locals() 进行字符串格式化有缺点吗?

转载 作者:bug小助手 更新时间:2023-10-28 10:51:48 25 4
gpt4 key购买 nike

这不是重复的,因为这涉及使用较新的 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 等的默认值),直到每个人都不再关注。

关于python - 使用 Python locals() 进行字符串格式化有缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com