带有可选占位符的 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()的主要内容,如果未能解决你的问题,请参考以下文章
在没有数字占位符的 JavaScript 中复制 C# 的 string.format()