python - تطبيقات - المتغيرات في بايثون



اختبار إذا كان المتغير هو قائمة أو مجموعة (8)

في python ، ما هي أفضل طريقة لاختبار ما إذا كان المتغير يحتوي على قائمة أو tuple؟ (أي مجموعة)

هل هي بمثابة شر كما اقترح هنا؟ http://www.canonical.org/~kragen/isinstance/

تحديث: السبب الأكثر شيوعًا الذي أريده للتمييز بين قائمة من سلسلة هو عندما يكون لديّ بنية شجرية / بيانات متداخلة بشكل غير محدود من قوائم القوائم الخاصة بالسلاسل الخ ، والتي أستكشفها باستخدام خوارزمية متكررة وأحتاج لمعرفة متى أصبت بعقد "leaf".

https://ffff65535.com


إذا كنت تحتاج فقط إلى معرفة ما إذا كان يمكنك استخدام foo[123] التدوين مع المتغير ، يمكنك التحقق من وجود سمة __getitem__ (وهو ما __getitem__ python عند الوصول بواسطة الفهرس) مع hasattr(foo, '__getitem__')


تستخدم بايثون "كتابة البط" ، أي إذا كان kwaks متغير مثل البط ، يجب أن يكون بطة. في حالتك ، ربما تريد أن تكون قابلة للتكرار ، أو تريد الوصول إلى العنصر في فهرس معين. يجب عليك فقط القيام بذلك: أي استخدام الكائن في for var: أو var[idx] داخل كتلة try ، وإذا حصلت على استثناء لم تكن بط ...


قم بتوثيق الوسيطة على أنها تحتاج إلى تسلسل ، واستخدمها كتسلسل. لا تحقق من النوع.


لا يوجد شيء خطأ في استخدام isinstance طالما أنها ليست زائدة عن الحاجة. إذا كان المتغير يجب أن يكون فقط قائمة / مجموعة ، قم بتوثيق الواجهة واستخدمها فقط. وإلا فإن الشيك معقول تمامًا:

if isinstance(a, collections.Iterable):
    # use as a container
else:
    # not a container!

يحتوي هذا النوع من التحقق على بعض حالات الاستخدام الجيدة ، كما هو الحال مع الطرق القياسية startswith / وضع endswith (على الرغم من أنها دقيقة يتم تنفيذها في C في CPython باستخدام فحص صريح لمعرفة ما إذا كانت علامة tuple - هناك أكثر من طريقة واحدة لحل هذه المشكلة ، كما هو مذكور في المقالة التي ترتبط بها).

غالباً ما يكون التحقق الصريح أفضل من محاولة استخدام الكائن كحاوية ومعالجة الاستثناء - يمكن أن يسبب كل أنواع المشاكل التي تحدث مع التعليمات البرمجية التي يتم تشغيلها جزئيًا أو غير ضروري.


من حيث المبدأ ، أتفق مع Ignacio ، أعلاه ، ولكن يمكنك أيضًا استخدام الكتابة للتحقق مما إذا كان شيء ما عبارة عن مجموعة أو قائمة.

>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')

يجب أن يكون الاختبار أكثر تعقيدًا إذا كنت تريد حقاً التعامل مع أي شيء كحجة دالة.

type(a) != type('') and hasattr(a, "__iter__")

على الرغم من أنه عادة ما يكفي لتوضيح أن الدالة تتوقع أنها قابلة للتكرار ثم تحقق فقط من type(a) != type('') .

قد يحدث أيضًا أن يكون لديك مسار معالجة بسيط لسلسلة ، أو أنك ستصبح لطيفًا ، وما إذا كان هناك انقسام ، وما إلى ذلك ، لذلك لا ترغب في الصراخ على السلاسل ، وإذا أرسل إليك شخص ما شيئًا غريبًا ، فقط دعه استثناء.


>>> l = []
>>> l.__class__.__name__ in ('list', 'tuple')
True

if type(x) is list:
    print 'a list'
elif type(x) is tuple:
    print 'a tuple'
else:
    print 'neither a tuple or a list'




list