Python:是否可以使用不带参数的string.format方法?

时间:2018-09-13 19:56:13

标签: python

只是古玩:有没有办法(ab)使用没有任何参数的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 个答案:

答案 0 :(得分:2)

从字面上讲,是的,可以使用不带参数的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会不必要地填充(默认)字典。


如果您真的想对位置替换字段进行操作,则最好的方法是传递大量参数,并希望每个字段都足够。 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 '