gpt4 book ai didi

python - Python 的 reversed() 函数是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 13:08:12 29 4
gpt4 key购买 nike

根据 Python's docs , reversed() 使用 __getitem____len__ 如果 __reversed__ 没有实现。

我遇到了一个奇怪的行为并且未能解释它:

>>> class A(dict):
... pass
...
>>> reversed(A())
Traceback (most recent call last):
...
TypeError: 'A' object is not reversible

>>> class B(dict):
... def __getitem__(self, key):
... return super().__getitem__(key)
... def __len__(self):
... return super().__len__()
...
>>> reversed(B())
Traceback (most recent call last):
...
TypeError: 'B' object is not reversible

>>> class C:
... def __getitem__(self, key):
... return "item"
... def __len__(self):
... return 1
...
>>> reversed(C())
<reversed object at 0x00000000022BB9B0>

尽管在映射类型上调用 reversed() 没有任何意义,但它如何知道它是一个映射?它是否在内部检查 isinstance(inst, dict)?它是否检查任何通用映射,如 collections.abc.Mapping?有什么方法可以在不实现 __reversed__ 的情况下覆盖此行为?

我认为这可能是由于 dict 实现了一个 __reversed__,它抛出了一个 TypeError,或者一个等于 None 很像你禁用 __hash__ 的方式,但是 dict.__reversed__ 结果是空的,并抛出了 AttributeError

更新:

新的 Python 版本为字典实现了 __reversed__。映射协议(protocol)(例如 collections.abc.Mapping)将 __reversed__ 设置为 None

最佳答案

是的,检查 dict 输入 PySequence_Check used by reversed .

// cpython/Objects/enumobject.c
if (!PySequence_Check(seq)) {
PyErr_Format(PyExc_TypeError,
"'%.200s' object is not reversible",
Py_TYPE(seq)->tp_name);
return NULL;
}


// cpython/Objects/abstract.c

int
PySequence_Check(PyObject *s)
{
if (PyDict_Check(s))
return 0;
return s != NULL && s->ob_type->tp_as_sequence &&
s->ob_type->tp_as_sequence->sq_item != NULL;
}

关于python - Python 的 reversed() 函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181249/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com