method to intercept string formatting % operations
Raymond Hettinger
python at rcn.com
Fri Feb 5 15:53:51 EST 2010
On Feb 5, 6:57 am, bradallen <bradallen... at gmail.com> wrote:
> Hello,
>
> For container class derived from namedtuple, but which also behaves
> like a dictionary by implementing __getitem__ for non-integer index
> values, is there a special reserved method which allows intercepting %
> string formatting operations? I would like for my container type to
> behave appropriately depending on whether the string formatting
> operation has a string like this :
>
> "whatever %s yadayada" % mycontainer # needs to act like a tuple
>
> "whatever %(key)s yadayada" % mycontainer # needs to act like a
> dictionary
The implementation for str.__mod__ refuses to
treat tuples and tuple subclasses as a dictionary.
Since namedtuples are a subclass of tuple, you're
not going to have any luck with this one.
To see actual C code, look at PyString_Format() in
http://svn.python.org/view/python/trunk/Objects/stringobject.c?view=markup
PyObject *dict = NULL;
. . .
if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) &&
!PyObject_TypeCheck(args, &PyBaseString_Type))
dict = args;
Since automatic conversion is out, you can instead use
the namedtuple._asdict() method for an explicit conversion:
>>> from collections import namedtuple
>>> Point = namedtuple('Point', 'x y')
>>> p = Point(5, 12)
>>> 'x: %(x)s' % p._asdict()
'x: 5'
Raymond
More information about the Python-list
mailing list