Fahmy Mostafa نشر 13 يوليو 2021 أرسل تقرير نشر 13 يوليو 2021 هل توجد دالة تقوم بالتحقق مما إذا كائن كائن ما قابل للتكرار iterable أم لا، شيء مثل الكود التالي: isiterable(myObj) # True or False 1 اقتباس
1 سامح أشرف نشر 13 يوليو 2021 أرسل تقرير نشر 13 يوليو 2021 يوجد العديد من الطرق للتحقق من نوع أي كائن في بايثون: يمكنك أن تستعمل collections كالتالي: from collections.abc import Iterable if isinstance(myObj, Iterable): # myObj هو كائن قابل للتكرار else: # غير قابل للتكرار كما يمكن أن تستعمل جملة try ... except كالتالي: try: iterator = iter(myObj) except TypeError: # الكائن myObj غير قايل للتكرار else: # iterable كما يمكنك أن تستعمل الدالة iter كالتالي: try: iter(myObj) # في الغالب هذا الكائن قابل للتكرار except TypeError: print('not iterable') طريقة أخرى وهي إستعمال الدالة getatter للتحقق من وجود الخاصية __iter__ في الكائن والتي تكون موجودة في الكائنات القابلة للتكرار، كالتالي: if getattr(myObj, '__iter__', False): print("myObj is iterable") بالطبع يمكن عمل دالة isiterable لتقوم بتطبيق أي طريقة من الطرق السابقة وترجع قيمة منطقية Boolean 1 اقتباس
0 عبدالله عبدالرحمن11 نشر 13 يوليو 2021 أرسل تقرير نشر 13 يوليو 2021 التفحص ب __iter__ يعمل على الأنواع المتسلسلة ولكنه سيفشل على سبيل المثال في السلاسل النصية في بايثون 2 ولكن لديك عدة حلول أخرى from __future__ import print_function # تجربة إذا كان الكائن قابل للتكرار try: some_object_iterator = iter(some_object) # طباعة نص إذا ظهر خطأ أن الكائن غير قابل للتكرار except TypeError as te: print(some_object, 'is not iterable') وايضا يمكنك تجربة تنفيذ حلقة كالآتي # تجربة حلقة في الكائن try: _ = (e for e in my_object) # طباعة نص عند ظهور خطأ أن الكائن غير قابل للتكرار except TypeError: print my_object, 'is not iterable' 1 اقتباس
1 Ali Haidar Ahmad نشر 14 يوليو 2021 أرسل تقرير نشر 14 يوليو 2021 (معدل) أولاً يجب أن تعلم أن أي كائن يمكننا المرور عليه بحلقة" looped over" هو كائن قابل للتكرار "iterable". على سبيل المثال ، كائن القائمة قابل للتكرار وكذلك كائن str. وللتأكد فيما إذا كان كائن ما قابل للتكرار في بايثون أم لا فهناك عدة طرق: أولها التابع __iter__ : s = 'Ali' if hasattr(s, '__iter__'): print(f'{s} is iterable') else: print(f'{s} is not iterable') # الخرج # Ali is iterable أو يمكنك تجربة __contains__ حيث تعتمد فكرتها على اختبار فيما إذا كان ال object يقبل المعامل in أو لا: hasattr(obj, '__contains__') # hasattr("adccads", '__contains__') True أو بنفس الفكرة مع التابع len: hasattr([8,2], "__len__") # True الطريقة الثانية هي بجعل مولد يحاول المرور على الكائن فإذا أخفق لن يكون قابل للتكرار : s="Ali" def iterable(a): try: (x for x in a) return True except TypeError: return False iterable(s) # True الطريقة الثالثة تعتمد على اختبار فيما إذا كان الكائن يمثل instance من الصف Iterable : from collections.abc import Iterable s = 'Ali' if isinstance(s, Iterable): print(f"{s} is iterable") else: print(f"{s} is not iterable") # Ali is iterable هناك طريقة أخرى خطرت لي وهي أن كل الكائنات القابلة للتكرار تمتلك التابع __getitem__ في ال dict الخاص بها: def is_attr(arg): return '__getitem__' in dir(arg) is_attr([5,8]) #True يمكنك أيضاً استخدام التابع iter لأنه في Python، المكرر هو أي كائن يدعم بروتوكول المكرر. جزء من هذا البروتوكول هو أن الكائن يجب أن يحتوي على طريقة __iter __ تقوم بإرجاع كائن المكرر لذالك أيضاً هنا نستطيع التحايل في استخدامها للاختبار : name = "ِAli" try: iter(name) print("{} is iterable".format(name)) except TypeError: print("{} is not iterable".format(name)) تم التعديل في 14 يوليو 2021 بواسطة Ali Haidar Ahmad 2 اقتباس
السؤال
Fahmy Mostafa
هل توجد دالة تقوم بالتحقق مما إذا كائن كائن ما قابل للتكرار iterable أم لا، شيء مثل الكود التالي:
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.