سؤال

كيف يمكنني التحقق مما إذا كان الكائن هو مثيل أ اسمه توبلي?

هل كانت مفيدة؟

المحلول

استدعاء وظيفة 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 المسمى. يبدو قويًا ضد بعض التغييرات المستقبلية التي يمكن تصورها أيضًا وقد تعمل أيضًا مع العديد من فصول الطرف الثالث المسماة ، إذا كانت هذه الأشياء موجودة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top