簡體   English   中英

在python中檢測一個枚舉對象

[英]Detect an enumerate object in python

如果我有清單

L = range(10)

我可以使用列表將其匹配

isinstance(L, list)

但是,如果我想列舉一下

M = enumerate(L)

現在它成為一個枚舉對象,它與列表不匹配,並且枚舉不是我可以使用isinstance進行匹配的標准python對象。

匹配枚舉對象的最優雅方法是什么?

為什么它不是標准的python對象? 您可以使用isinstance(M, enumerate)檢查:

In [128]: e
Out[128]: <enumerate at 0x6933b70>

In [129]: type(e)
Out[129]: enumerate

In [130]: isinstance(e, enumerate)
Out[130]: True

提供enumerate作為isinstance的第二個參數應該可以正常工作:

isinstance(M, enumerate)

請參見下面的演示:

>>> M = enumerate(range(10))
>>> M
<enumerate object at 0x020B7EB8>
>>> isinstance(M, enumerate)
True
>>>

這就是文檔所說的*:

isinstance(object,classinfo)

如果object參數是classinfo參數或其>(直接,間接或虛擬)子類的實例,則返回true。 如果object不是給定類型的對象,則該函數始終返回false。 如果classinfo不是類(類型對象),則它可能是類型對象的元組,或者可以遞歸包含其他此類元組(不接受其他序列類型)。 如果classinfo不是類型或此類的元組,則引發TypeError異常。


*我加粗體。

雖然我看不到您為什么要這樣做,但是您可以簡單地匹配類型:

>>> enumerate
<type 'enumerate'>
>>> isinstance(enumerate(range(10)),enumerate)
True

聽起來好像您真正想要做的是測試以查看是否可以使用for循環遍歷類型。 這樣做的方法是測試稱為__iter__的方法:

if hasattr(l, '__iter__'):
    # do something with the iterable

或者,您可以使用標准庫:

from collections.abc import Iterable
if isinstance(l, Iterable):
    # do something with the iterable

這種方法將非常適合列表, enumerate ,元組和任何可迭代的自定義對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM