The namedtuple
implementation in Python 2.7 implements __dict__
. I'm confused what this is doing; why do we need to make a special __dict__
if there are already properties defined?
C:\tmp> python
Python 2.7.12 |Anaconda 4.1.1 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import collections
>>> x = collections.namedtuple('foo','bar baz', verbose=True)
class foo(tuple):
'foo(bar, baz)'
__slots__ = ()
_fields = ('bar', 'baz')
def __new__(_cls, bar, baz):
'Create new instance of foo(bar, baz)'
return _tuple.__new__(_cls, (bar, baz))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new foo object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 2:
raise TypeError('Expected 2 arguments, got %d' % len(result))
return result
def __repr__(self):
'Return a nicely formatted representation string'
return 'foo(bar=%r, baz=%r)' % self
def _asdict(self):
'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self))
def _replace(_self, **kwds):
'Return a new foo object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('bar', 'baz'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self)
__dict__ = _property(_asdict)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
pass
bar = _property(_itemgetter(0), doc='Alias for field number 0')
baz = _property(_itemgetter(1), doc='Alias for field number 1')
They just thought it would be convenient. Turns out it was more hassle than it was worth, causing issues with pickling and with subclasses, and it was conceptually confusing anyway. More recent Python versions don't have it any more.