代码之家  ›  专栏  ›  技术社区  ›  Ausar

python类型中的标志用于什么

  •  2
  • Ausar  · 技术社区  · 8 年前

    中的以下代码 copy_reg 让我困惑:

    _HEAPTYPE = 1<<9
    
    def _reduce_ex(self, proto):
        assert proto < 2
        for base in self.__class__.__mro__:
            if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
                break
        else:
            base = object # not really reachable
        if base is object:
            state = None
    

    那么是什么呢 __flags__ 用于?

    我发现它是在 type 对象:

    type.__flags__ = 2148423147
    

    我试图在官方文件中搜索它,但什么也没找到。

    但有趣的是 __class__.__flags__ & _HEAPTYPE 总是 0 __class__ 是python内部类型。结果会是 1 什么时候 __类别__ 是python内部类型的子类。

    有人能帮我解决这个难题吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   georgexsh    8 年前

    __flags__ 是一个包装, to access CPython type object structure member tp_flags ,用于组成此标志的常数 defined in object.h ,以下引自消息来源:

    类型标志(tp_标志) 这些标志用于以向后兼容的方式扩展类型结构 时尚扩展可以使用标志来指示(和测试)给定的 类型结构包含一个新功能。Python核心将在以下情况下使用它们: 在主要版本之间引入新功能(以避免中间版本 PYTHON_API_版本中的更改)。

    查看更多详细信息 python document on tp_flags .

    但有趣的是 . 旗帜 &_当 是python内部类型。当 是python内部类型的子类。

    python内置类型的子类,与其他用户定义类型一样,在堆上分配 PyType_GenericAlloc() .


    崩溃 type.__flags__ :

    import re
    
    def flags_to_name(type_obj):
        tp_flag_consts = {}        
        with open('/path/to/Include/object.h') as f:
            for l in f:
                m = re.search(r'^#define (Py_TPFLAGS_\w+)\s+\(.+?<< (\d+)\)', l.strip())
                if m:
                    tp_flag_consts[int(m.group(2))] = m.group(1)
        bin_str = bin(type_obj.__flags__)[2:][::-1]
        return ', '.join(tp_flag_consts[n] for n, c in enumerate(bin_str) if c == '1')
    
    print(flags_to_name(type))
    

    产量:

    Py_TPFLAGS_BASETYPE, Py_TPFLAGS_READY, Py_TPFLAGS_HAVE_GC, Py_TPFLAGS_HAVE_VERSION_TAG, Py_TPFLAGS_VALID_VERSION_TAG, Py_TPFLAGS_TYPE_SUBCLASS
    
        2
  •  2
  •   ForceBru    8 年前

    __flags__ 如果您想查看标志,则将被视为二进制。

    定义了这些类型标志 here 在Python的源代码中。