python 内部如何实现命名元组?
问题描述
命名元组是易于创建的轻量级对象类型.namedtuple
实例可以使用类似对象的变量引用或标准元组语法来引用.如果这些数据结构可以通过对象延迟和访问索引,它们是如何在内部实现的?是通过哈希表吗?
Named tuples are easy to create, lightweight object types. namedtuple
instances can be referenced using object-like variable deferencing or the standard tuple syntax. If these data structures can be accessed both by object deferencing & indexes, how are they implemented internally? Is it via hash tables?
解决方案
实际上,很容易找出给定的 namedtuple
是如何实现的:如果传递关键字参数 verbose=True
创建时,打印其类定义:
Actually, it's very easy to find out how a given namedtuple
is implemented: if you pass the keyword argument verbose=True
when creating it, its class definition is printed:
>>> Point = namedtuple('Point', "x y", verbose=True)
from builtins import property as _property, tuple as _tuple
from operator import itemgetter as _itemgetter
from collections import OrderedDict
class Point(tuple):
'Point(x, y)'
__slots__ = ()
_fields = ('x', 'y')
def __new__(_cls, x, y):
'Create new instance of Point(x, y)'
return _tuple.__new__(_cls, (x, y))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Point 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 _replace(_self, **kwds):
'Return a new Point object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('x', 'y'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % list(kwds))
return result
def __repr__(self):
'Return a nicely formatted representation string'
return self.__class__.__name__ + '(x=%r, y=%r)' % self
@property
def __dict__(self):
'A new OrderedDict mapping field names to their values'
return OrderedDict(zip(self._fields, self))
def _asdict(self):
'''Return a new OrderedDict which maps field names to their values.
This method is obsolete. Use vars(nt) or nt.__dict__ instead.
'''
return self.__dict__
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
return None
x = _property(_itemgetter(0), doc='Alias for field number 0')
y = _property(_itemgetter(1), doc='Alias for field number 1')
所以,它是 tuple
的子类,带有一些额外的方法来赋予它所需的行为,一个包含字段名称的 _fields
类级常量,以及 property
用于访问元组成员的属性的方法.
So, it's a subclass of tuple
with some extra methods to give it the required behaviour, a _fields
class-level constant containing the field names, and property
methods for attribute access to the tuple's members.
至于实际构建这个类定义背后的代码,那就是 深奥的魔法.
As for the code behind actually building this class definition, that's deep magic.
相关文章