带有可选占位符的 string.format()

Posted

技术标签:

【中文标题】带有可选占位符的 string.format()【英文标题】:string.format() with optional placeholders 【发布时间】:2012-06-16 20:52:28 【问题描述】:

我有以下 Python 代码(我使用的是 Python 2.7.X):

my_csv = 'first,middle,last'
print( my_csv.format( first='John', last='Doe' ) )

我收到 KeyError 异常,因为未指定“中间”(这是预期的)。但是,我希望所有这些占位符都是可选的。如果未指定这些命名参数,我希望删除占位符。所以上面打印的字符串应该是:

John,,Doe

是否有使这些占位符可选的内置功能,还是需要一些更深入的工作?如果是后者,如果有人能告诉我最简单的解决方案,我将不胜感激!

【问题讨论】:

【参考方案1】:

这是一种选择:

from collections import defaultdict

my_csv = 'd[first],d[middle],d[last]'
print( my_csv.format( d=defaultdict(str, first='John', last='Doe') ) )

【讨论】:

我看到你正在使用str。这是什么?编辑:我现在看到这是工厂方法,而不是变量名。所以工厂会创建空白字符串。【参考方案2】:

这是另一个使用字符串插值运算符%的选项:

class DataDict(dict):
    def __missing__(self, key):
        return ''

my_csv = '%(first)s,%(middle)s,%(last)s'
print my_csv % DataDict(first='John', last='Doe')  # John,,Doe

或者,如果您更喜欢使用更现代的 str.format() 方法,以下方法也可以使用,但在某种意义上不太自动,因为您将提前明确定义每个可能的占位符(尽管您可以 如果需要,可以即时修改 DataDict.placeholders):

class DataDict(dict):
    placeholders = 'first', 'middle', 'last'
    default_value = ''
    def __init__(self, *args, **kwargs):
        self.update(dict.fromkeys(self.placeholders, self.default_value))
        dict.__init__(self, *args, **kwargs)

my_csv = 'first,middle,last'
print(my_csv.format(**DataDict(first='John', last='Doe')))  # John,,Doe

【讨论】:

【参考方案3】:
"It doescond contain the the thing.".format(cond="" if condition else " not")

我想我会添加这个,因为自从提出问题以来它一直是一个特性,这个问题仍然在谷歌结果的早期弹出,并且这个方法直接内置在 python 语法中(不需要导入或自定义类)。这是一个简单的shortcut conditional statement。它们易于阅读(保持简单时),并且short-circuit 通常很有帮助。

【讨论】:

这段代码帮助了我,我正在寻找一种打印字符串列表的方法,其中一些字符串有占位符,我想用常量替换。所以我一直在寻找一种使用 string.format 的方法,这样它就不会抱怨没有占位符的字符串; string.format(cond=value)【参考方案4】:

我遇到了和你一样的问题,并决定创建一个库来解决这个问题:pyformatting。 以下是您的 pyformatting 问题的解决方案:

>>> from pyformatting import defaultformatter
>>> default_format = defaultformatter(str)
>>> my_csv = 'first,middle,last'
>>> default_format(my_csv, first='John', last='Doe')
'John,,Doe'

唯一的问题是 pyformatting 不支持 python 2。pyformatting 支持 python 3.1+ 如果我看到任何关于需要 2.7 支持的反馈,我想我会添加该支持。

【讨论】:

虽然这个问题是 8 年前提出的,但我认为它可能会帮助其他有此问题的人 你的不是完全我要求的;如果未替换占位符,则应将其删除。 @void.pointer,这不是库中的问题还有一个函数可以满足这一点,我编辑了答案 偷偷说,如果你点击库链接,那么你会在起始页上看到这种行为的例子 虽然这个库还很年轻,但它的功能会不断发展壮大。总会有新的想法。 (我已经对新格式化程序的行为有了一些想法)

以上是关于带有可选占位符的 string.format()的主要内容,如果未能解决你的问题,请参考以下文章

最常用两种java中的占位符的使用

Lua中string.format占位符的使用

在没有数字占位符的 JavaScript 中复制 C# 的 string.format()

java中两种占位符的使用方式

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

带有占位符的 FormatMessage