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

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

https://stackoverflow.com/questions/20713714/

相关文章:

c# - 使 Console.WriteLine() 换行而不是字母

java - 在 String.format() 中选择参数

php - 定义跨平台money_format函数(Linux和Windows)

ruby - 使用 %w 时包括空格

java - 如何在 Java 中将表格数据格式化为文本?

git - 在一系列 git 提交上运行 git-clang-format

c++ - 使用 boost::date_time 库以毫秒为单位格式化时间

asp.net-mvc - 具有自定义格式的 ASP.NET MVC ViewModel 映射

c# - 将电话号码解析为其部分

python - 是否有与 Linux/Unix "fold"命令等效的 Vim?