只是古玩:有没有办法(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
创建参数化字符串?
答案 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 '