: : , , , - , , .
, , , string.Formatter() , , 2.6 3.1 ( 2.7), C, string.
MyFormatter:
from __future__ import print_function
from string import Formatter
import sys
w = 10
x = dict(a=1, ab=2, abc=3)
if sys.version_info < (3,):
int_type = (int, long)
else:
int_type = (int)
class MyFormatter(Formatter):
def vformat(self, *args):
self._automatic = None
return super(MyFormatter, self).vformat(*args)
def get_value(self, key, args, kwargs):
if key == '':
if self._automatic is None:
self._automatic = 0
elif self._automatic == -1:
raise ValueError("cannot switch from manual field specification "
"to automatic field numbering")
key = self._automatic
self._automatic += 1
elif isinstance(key, int_type):
if self._automatic is None:
self._automatic = -1
elif self._automatic != -1:
raise ValueError("cannot switch from automatic field numbering "
"to manual field specification")
return super(MyFormatter, self).get_value(key, args, kwargs)
KeyError. format_field parse:
if sys.version_info < (3,):
string_type = basestring
else:
string_type = str
class TrailingFormatter(MyFormatter):
def format_field(self, value, spec):
if isinstance(value, string_type) and len(spec) > 1 and spec[0] == 't':
value += spec[1]
spec = spec[2:]
return super(TrailingFormatter, self).format_field(value, spec)
kf = TrailingFormatter()
w = 10
for k in sorted(x):
v = x[k]
print(kf.format('key {:t:<{}} {}', k, w, v))
:
key a: 1
key ab: 2
key abc: 3
(t), .
Python , , :
print(kf.format('key {:t{}<{}} {}', k, ':', w, v))
':'
format_field :
def format_field(self, value, spec):
if len(spec) > 1 and spec[0] == 't':
value = str(value) + spec[1]
spec = spec[2:]
return super(TrailingFormatter, self).format_field(value, spec)
:
print(kf.format('key {:t{}<{}} {}', (1, 2), '@', 10, 3))
:
key (1, 2)@ 3
Formatter.formatfield(), , str(val) , {0}.format(val) / t:, (, + -)