python序列_什么是Python的序列协议?
這不是真的一致.
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;
}
PySequence_Check檢查對(duì)象是否提供C序列協(xié)議,通過(guò)表示對(duì)象類(lèi)型的PyTypeObject中的tp_as_sequence成員實(shí)現(xiàn).此tp_as_sequence成員是一個(gè)指向結(jié)構(gòu)的指針,該結(jié)構(gòu)包含一系列用于序列行為的函數(shù),例如sq_item用于通過(guò)數(shù)字索引檢索項(xiàng)目,sq_ass_item用于項(xiàng)目分配.
具體來(lái)說(shuō),PySequence_Check要求其參數(shù)不是dict,并且它提供sq_item.
使用Python編寫(xiě)的__getitem__類(lèi)型將提供sq_item,無(wú)論它們是概念序列還是映射,因此用Python編寫(xiě)的不從dict繼承的映射將通過(guò)PySequence_Check.
另一方面,collections.abc.Sequence僅檢查對(duì)象是否具體地從collections.abc.Sequence繼承,或者它的類(lèi)(或超類(lèi))是否使用collections.abc.Sequence顯式注冊(cè).如果你只是自己實(shí)現(xiàn)一個(gè)序列而不做其中任何一個(gè),它就不會(huì)通過(guò)isinstance(your_sequence,Sequence).此外,使用collections.abc.Sequence注冊(cè)的大多數(shù)類(lèi)都不支持所有collections.abc.Sequence的方法.總體而言,collections.abc.Sequence的可靠性遠(yuǎn)遠(yuǎn)低于人們通常的預(yù)期.
至于什么算作實(shí)際中的序列,它通常是任何支持__len__和__getitem__的整數(shù)索引從0開(kāi)始并且不是映射.如果一個(gè)函數(shù)的文檔說(shuō)它需要任何序列,那幾乎總是它需要它.不幸的是,“不是映射”很難測(cè)試,原因類(lèi)似于“序列”如何難以確定.
總結(jié)
以上是生活随笔為你收集整理的python序列_什么是Python的序列协议?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: if嵌套while循环语句_选考VB算法
- 下一篇: websocket python爬虫_p