使用带有关键字参数的动态长度字符串(使用*)进行Python字符串插值(不是`string.format`)

时间:2015-11-11 10:44:48

标签: python string string-interpolation

对于使用字符串插值系统在很多地方使用的遗留系统,我需要实现一些格式化具有特定长度的字符串的代码。我知道rjustljust可以解决这个问题,但我正在尝试回答标准字符串插值系统是否可行的问题。

示例:

>>> '%0*d' % (5, 3)
'00003'
>>> '%(value)05d' % dict(value=3)
'00003'

现在问题是,如何将这两者结合起来?

我失败的尝试:

>>> '%(value)*d' % dict(value=(5, 3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: * wants int
>>> '%(value)*d' % dict(value=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> '%(value)*d' % {'*': 5, 'value': 3}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> '%(value)*d' % {'*value': 5, 'value': 3}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

问题是:如何使用字符串插值组合星号和关键字参数?

注意: str.format 这个问题的答案,我不是在寻找替代方案,而只是回答这个问题是否可行或不。用str.format替换字符串插值需要当前库的许多用户修改函数调用,这对于不久的将来是一个不利的选择。

1 个答案:

答案 0 :(得分:2)

不,你不能这样做。每the documentation(强调我的):

  
      
  1. 最小字段宽度(可选)。如果指定为'*'(星号),则从的下一个元素读取实际宽度    中的元组,要转换的对象在最小值之后   字段宽度和可选精度。
  2.   

您需要传递元组而不是字典作为使用*字段宽度的值。然后明确说明:

  

当右参数是字典(或其他映射类型)时,...   没有*说明符可能以格式出现(因为它们需要顺序   参数列表)。