代码之家  ›  专栏  ›  技术社区  ›  bohrax

Python:可以使用string.format格式没有参数的方法?

  •  0
  • bohrax  · 技术社区  · 7 年前

    只是好奇:有没有办法使用 string.format

    假设我想要这样的字符串:

    'foo   bar    '   # Desired string
    

    我可以创建一个模板字符串,如:

    'foo{:3}bar{:4}'
    

    然后将其与伪参数一起使用,例如:

    >>> 'foo{:3}bar{:4}'.format('', '')
    'foo   bar    '
    >>> 'foo{:3}bar{:4}'.format(*'  ')
    'foo   bar    '
    

    由于省略参数会导致此错误:

    >>> 'foo{:3}bar{:4}'.format()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: tuple index out of range
    

    我甚至可以创建一个虚拟变量,比如:

    'foo{s:3}bar{s:4}'.format(s='')
    

    但是有没有更优雅的方法来创建参数化字符串 string.format格式 ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   user2357112    7 年前

    从字面上说,是的,可以使用 str.format 无参数:

    >>> 'asdf'.format()
    'asdf'
    


    如果您想为所有内容传递空字符串,那么使用位置替换字段是不可能的。使用命名替换字段和 format_map :

    >>> class Defaults(object):
    ...     def __getitem__(self, key):
    ...         return ''
    ... 
    >>> 'asdf {a} fdsa {b}'.format_map(Defaults())
    'asdf  fdsa '
    

    collections.defaultdict(str) 而不是编写我们自己的类,但是对于这个用例,我不喜欢 defaultdict 将不必要地填充(默认)dict。


    如果您真的想使用位置替换字段,那么最好传递大量参数,并希望每个字段都有足够的参数。 str.format格式

    >>> 'asdf {} fdsa {}'.format(*['']*100)
    'asdf  fdsa '
    

    如果你同意使用稍微不同的格式API, string.Formatter

    import string
    class MyFormatter(string.Formatter):
        def get_value(self, key, args, kwargs):
            # Yes, no * or ** on args or kwargs. That's what the signature looks like.
            try:
                return super(MyFormatter, self).get_value(key, args, kwargs)
            except (IndexError, KeyError):
                return ''
    

    演示:

    >>> MyFormatter().format('asdf {} fdsa {}')
    'asdf  fdsa '