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'