我可以檢查next()
方法,但這足夠嗎?有沒有意識形態的方法?如何檢查對象是否是Python中的迭代器?
回答
在Python 2.6或更高,所設計的,在成語對於這種行爲的檢查是一種「成員資格檢查」與抽象基類的collections
模塊的標準庫中:
>>> import collections
>>> isinstance('ciao', collections.Iterable)
True
>>> isinstance(23, collections.Iterable)
False
>>> isinstance(xrange(23), collections.Iterable)
True
事實上,這種檢查是首要的設計原因,新的抽象基類(第二重要的是在一些提供「混入功能」案件,這就是爲什麼他們是ABC rath呃不只是接口 - 但這不適用於collections.Iterable
,它存在嚴格允許與isinstance
或issubclass
)這樣的檢查。 ABCs允許那些實際上並不從它們繼承的類被「註冊」爲子類,因此這些類可以是ABC的「子類」,用於這種檢查;並且他們可以在內部執行特殊方法所需的全部檢查(本例中爲__iter__
),因此您不必這樣做。
如果你堅持與Python的舊版本,「這是更好地請求原諒比許可」:
def isiterable(x):
try: iter(x)
except TypeError: return False
else: return True
但是這沒有那麼快,簡潔的新方法。
請注意,對於這種特殊情況,您經常需要特殊字符串(這是可迭代的,但大多數應用程序上下文無論如何都要將其視爲「標量」)。不管你的方法是使用檢查iterableness,如果你需要這種特殊的外殼只是在前面加上一個檢查isinstance(x, basestring)
- 例如:
def reallyiterable(x):
return not isinstance(x, basestring) and isinstance(x, collections.Iterable)
編輯:如在評論中指出,問題集中在是否一個對象是一個****,而不是它是否可以***(所有迭代器都可迭代,但反之亦然 - 並非所有迭代器都是迭代器)。 isinstance(x, collections.Iterator)
是專門檢查該情況的完全類似方法。
如果對象實現迭代器協議,則該對象是可迭代的。
你可以檢查__iter__()
方法存在有:
hasattr(object,'__iter__')
在Python 2.x的這種方法忽略海峽對象和其他內置序列類型,如統一,x範圍,緩衝區。它的工作原理在Python 3
另一種方式是與國際熱核實驗堆的方法來測試它:
try:
iter(object)
except TypeError:
#not iterable
創建迭代器可能是昂貴的,而檢查屬性的存在總是*快*。 – 2012-09-29 16:35:58
要成爲一個迭代的對象必須通過三個測試:
obj
具有(在Python 3或__next__
)的__iter__
方法obj
具有next
方法obj.__iter__()
返回obj
所以,一個自己的測試會看起來像:
def is_iterator(obj):
if (
hasattr(obj, '__iter__') and
hasattr(obj, 'next') and # or __next__ in Python 3
callable(obj.__iter__) and
obj.__iter__() is obj
):
return True
else:
return False
會調用'obj .__ iter __()'冒着改變某些東西的風險嗎? – 2017-09-25 18:38:42
@ BobStein-VisiBone:只有當對象有問題時。 – 2018-02-06 16:49:34
- 1. 如何檢查一個對象是否可以在Python中迭代?
- 2. 如何檢查對象是否是python中的生成器對象?
- 3. 如何檢查對象是否是Cocoa中的Foundation對象?
- 4. 檢查對象是否爲集合/可迭代的?
- 5. Python:如何檢查對象的屬性是否是方法?
- 6. 檢查迭代器是否對QT容器有效
- 7. 混淆了一個例子來檢查一個對象是否是Python中的迭代器
- 8. Angular爲什麼不檢查迭代對象是否存在?
- 9. 如何檢查迭代器指定的範圍是否有效?
- 10. 檢查哪個對象的迭代器是在
- 11. Python:我如何檢查對象是否是模塊?
- 12. Javassist:檢查對象是否爲代理
- 13. 檢查Python for循環的所有迭代中是否有錯
- 14. 如何檢查迭代器是否指向存在
- 15. 在python中如何檢查一個對象是否有值?
- 16. 如何檢查對象是否存在?
- 17. 如何檢查對象是否爲空
- 18. 如何檢查對象是否爲UIButton
- 19. 如何檢查對象是否爲空?
- 20. 如何檢查對象是否爲空
- 21. 如何檢查對象是否爲「空」?
- 22. 如何迭代對象數組並檢查屬性是否存在?
- 23. 檢查對象是否是Python中列表的列表?
- 24. 如何檢查PHP對象是否是MongoDate對象?
- 25. 如何檢查對象是否在Domain對象的集合中?
- 26. Python檢查對象是否在對象列表中
- 27. 如何檢查一個迭代器是否實際上是一個迭代器容器?
- 28. 檢查一個類是否可迭代
- 29. 如何檢測類型是否是迭代器或const_iterator
- 30. 如何檢查對象是否是Java中的集合類型?
這些問題詢問對象是否是迭代器,而不是如果它是可迭代的。所以你應該使用collections.Iterator而不是collections.Iterable – 2010-06-11 17:04:40
@Dave,對,讓我編輯澄清。 – 2010-06-11 18:04:33