【问题标题】:string.format() with optional placeholders带有可选占位符的 string.format()
【发布时间】: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

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

【问题讨论】:

    标签: python string-formatting template-variables


    【解决方案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 does{cond} 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,这不是库中的问题还有一个函数可以满足这一点,我编辑了答案
      • 偷偷说,如果你点击库链接,那么你会在起始页上看到这种行为的例子
      • 虽然这个库还很年轻,但它的功能会不断发展壮大。总会有新的想法。 (我已经对新格式化程序的行为有了一些想法)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2014-05-13
      • 2016-07-17
      • 2016-04-09
      相关资源
      最近更新 更多