Skip to main content
 首页 » 编程设计

Python 无法识别 namedtuple 的类型

2025年05月04日9mate10pro

我怀疑这个问题以前有人问过,但我没能找到,所以这里是:

在 Python 上(使用 2.7)我创建了一个 namedtuple 如下:

>>> sgn_tuple = namedtuple('sgnt',['signal','type']) 
>>> a = sgn_tuple("aaa","bbb") 

然后我想检查 t 的类型,我的结果很奇怪:

>>> type (a) 
<class '__main__.sgnt'> 
>>> a is tuple 
False 
>>> a is namedtuple 
False 
>>> a is sgnt 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
NameError: name 'sgnt' is not defined 
>>> a is sgn_tuple 
False 
>>> 

为什么会这样?我希望 a 被识别为元组类型,但事实并非如此。有什么提示吗?

请您参考如下方法:

is 不检查类成员。 is 检查两个对象是否具有相同的 id

>>> isinstance(a, tuple) 
True 

另外type(a)不是tuple,a是tuple的子类。

如果您输入 verbose=True,您可以看到它是如何制作的(文本是动态生成的以创建类):

>>> sgn_tuple = namedtuple('sgnt',['signal','type'],verbose=True) 
 
class sgnt(tuple): 
        'sgnt(signal, type)'  
 
        __slots__ = ()  
 
        _fields = ('signal', 'type')  
 
        def __new__(_cls, signal, type): 
            'Create new instance of sgnt(signal, type)' 
            return _tuple.__new__(_cls, (signal, type))  
 
        @classmethod 
        def _make(cls, iterable, new=tuple.__new__, len=len): 
            'Make a new sgnt 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 'sgnt(signal=%r, type=%r)' % self  
 
        def _asdict(self): 
            'Return a new OrderedDict which maps field names to their values' 
            return OrderedDict(zip(self._fields, self))  
 
        __dict__ = property(_asdict)  
 
        def _replace(_self, **kwds): 
            'Return a new sgnt object replacing specified fields with new values' 
            result = _self._make(map(kwds.pop, ('signal', 'type'), _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)  
 
        signal = _property(_itemgetter(0), doc='Alias for field number 0') 
        type = _property(_itemgetter(1), doc='Alias for field number 1') 

这只是由 Python 执行。我希望一切都清楚。