如何檢查對象是否爲Named tuple的實例?Python:如何檢查一個對象是否是namedtuple的一個實例?
回答
調用功能collections.namedtuple
爲您提供了一種新型的年代tuple
與命名_fields
成員,這是一個元組,其項目全部串子類(並且沒有其他類)。所以,你可以檢查這些事情每一個:
def isnamedtupleinstance(x):
t = type(x)
b = t.__bases__
if len(b) != 1 or b[0] != tuple: return False
f = getattr(t, '_fields', None)
if not isinstance(f, tuple): return False
return all(type(n)==str for n in f)
有可能從該得到假陽性,但只有當有人在走出去的方式,使一個類型,看起來很多像一個命名的元組,但不是一個;-)。
正確。我還想知道爲什麼生成的類型不是從標記類'NamedTuple'派生的,它的定義只是'class NamedTuple(tuple):pass' ..只是爲了方便我們檢查一個對象是否是一個namedtuple或者不。 – 2010-01-30 04:25:05
爲什麼namedtuple的設計師會讓它變得可怕,Sridhar?在Python中通常要避免使用類型檢查,在這種情況下,不會告訴你任何有用的東西 - 具有'x'和'y'字段的名稱集合以及具有'cost','price'和'quantity'字段的名稱aren aren將不可互換。它們可以互換的唯一級別是它們都是元組。 即使在使用由namedtuple工廠生成的類的使用情況下,它們也只是普通類,具有很好的理由,並且可以像使用類似的手工類一樣使用。 – 2010-01-30 21:20:27
@Mike:我寫了一個名爲元組的擴展..其中mixin聲明它與指定元組一起用作其兄弟基類。所以我只需要它來聲明mixin不會被其他類型濫用。 – 2010-01-30 21:32:15
如果您在調用namedtuple特定函數之前需要檢查,那麼只需調用它們並捕獲異常。這是使用python的首選方式。
我對上面馬修的回覆解釋了我使用這張支票的地方。 – 2010-01-30 04:31:02
我用
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
這對我來說似乎是最能體現一個名爲元組的性質的字典方面。 它似乎對一些可以想象的將來的變化也很有效,如果這種情況發生,也可能與許多第三方命名的三類類一起工作。
這將導致錯誤,當'x =(1,2,3)' – kolypto 2014-09-02 10:31:43
我意識到這是舊的,但我發現這個有用:
from collections import namedtuple
SomeThing = namedtuple('SomeThing', 'prop another_prop')
SomeOtherThing = namedtuple('SomeOtherThing', 'prop still_another_prop')
a = SomeThing(1, 2)
isinstance(a, SomeThing) # True
isinstance(a, SomeOtherThing) # False
除非我失去了一些東西,這似乎是最好和最簡潔的答案。 namedtuple創建一個新類型,isinstance將檢查是否有某種類型。 – 2018-02-20 17:08:26
- 1. 如何檢查一個對象是否被實例化?
- 2. 如何檢查一個對象是否是一個字符串?
- 3. 檢查是否是一個對象
- 4. 檢查一個對象是否已經在Java中實例化
- 5. python 3:如何檢查一個對象是否是一個函數?
- 6. 檢查一個實例變量是否有一個或多個對象?
- 7. 木偶:檢查一個佈局是否有另一個對象的實例
- 8. 如何檢查一個Activity的多個實例是否存在
- 9. 在python中如何檢查一個對象是否有值?
- 10. 如何檢查一個變量是否是一個類的實例?
- 11. 檢查一個對象是否爲空
- 12. 如何檢查對象是否是一個Vue的成分?
- 13. PHP:檢查一個變量是否是某個類的實例
- 14. 如何檢查一個字符串是否是一個對象的實例變量?
- 15. 如何測試一個Python對象是否是一個模塊?
- 16. 如何檢查一個對象是否實現了一個接口?
- 17. 如何檢查一個對象是不是一個數組?
- 18. 如何檢查一個對象是否是Blob類型?
- 19. 如何檢查元素是否爲U的一個實例?
- 20. 如何檢查一個對象是否包含另一個對象?
- 21. in_array如何檢查一個對象是否在一個對象數組中?
- 22. 如何檢查對象是否是特定類的實例?
- 23. 如何檢查對象是否是IE中NodeList的實例?
- 24. 檢查一個對象是否是委託對象
- 25. 如何檢查兩個對象是否屬於同一個類?
- 26. 如何檢查一個id是一個實例還是一個類?
- 27. 如何檢查一個對象是否在邏輯上是一個數組,JavaScript
- 28. C#:如何檢查一個實例是否可序列化
- 29. 如何檢查一個實例是否屬於登錄用戶?
- 30. 如何檢查一個實例是否爲枚舉類型
你需要絕對知道,或者是一種啓發式好嗎?如果是後者,你可以檢查例如obj._asdict .__ doc__ =='返回一個新的OrderedDict,它將字段名稱映射到它們的值(可能還有其他因素)。當然, – 2010-01-30 04:18:04
絕對如此。但是因爲我只是在'assert'語句中使用這個「檢查」(我正在向namedtuples寫一個擴展......這個mixin聲明它與namedtuple一起用作它的兄弟基類),啓發式檢查也可能是精細。我認爲值得將'__doc__'檢查添加到Alex的代碼中。 – 2010-01-30 04:26:31
FWIW,這是提交作爲一個「錯誤」(不知道我同意):http://bugs.python.org/issue7796 – bernie 2010-01-30 04:32:49