كيفية التحقق مما إذا كان كائن هو مثيل لـ namedtuple؟
-
24-09-2019 - |
سؤال
كيف يمكنني التحقق مما إذا كان الكائن هو مثيل أ اسمه توبلي?
المحلول
استدعاء وظيفة 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)
من الممكن الحصول على إيجابية خاطئة من هذا ، ولكن فقط إذا كان هناك شخص ما في طريقه إلى صنع نوع يبدو كثيرا مثل tuple المسماة ولكن ليس واحد ؛-).
نصائح أخرى
أدرك أن هذا قديم ، لكنني وجدت هذا مفيدًا:
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 ، فما عليك سوى الاتصال بها وتولى الاستثناء بدلاً من ذلك. هذه هي الطريقة المفضلة للقيام بذلك في بيثون.
تحسين ما نشره لوتز:
def isinstance_namedtuple(x):
return (isinstance(x, tuple) and
isinstance(getattr(x, '__dict__', None), collections.Mapping) and
getattr(x, '_fields', None) is not None)
أنا أستعمل
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
الذي يبدو لي أنه يعكس بشكل أفضل الجانب القاموس لطبيعة tuples المسمى. يبدو قويًا ضد بعض التغييرات المستقبلية التي يمكن تصورها أيضًا وقد تعمل أيضًا مع العديد من فصول الطرف الثالث المسماة ، إذا كانت هذه الأشياء موجودة.