اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

يوجد العديد من الطرق للتحقق من نوع أي كائن في بايثون:

  1. يمكنك أن تستعمل collections كالتالي:
    from collections.abc import Iterable
    
    if isinstance(myObj, Iterable):
        # myObj هو كائن قابل للتكرار
    else:
      	# غير قابل للتكرار

     

  2. كما يمكن أن تستعمل جملة try ... except كالتالي:
    try:
        iterator = iter(myObj)
    except TypeError:
        # الكائن myObj غير قايل للتكرار
    else:
        # iterable

     

  3. كما يمكنك أن تستعمل الدالة iter كالتالي:
    try:
        iter(myObj)	# في الغالب هذا الكائن قابل للتكرار
    except TypeError:
        print('not iterable')

     

  4. طريقة أخرى وهي إستعمال الدالة getatter  للتحقق من وجود الخاصية __iter__ في الكائن والتي تكون موجودة في الكائنات القابلة للتكرار، كالتالي:
    if getattr(myObj, '__iter__', False):
      print("myObj is iterable")

    بالطبع يمكن عمل دالة isiterable لتقوم بتطبيق أي طريقة من الطرق السابقة وترجع قيمة منطقية Boolean

  • 1
نشر (معدل)

أولاً يجب أن تعلم أن أي كائن يمكننا المرور عليه بحلقة" 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))

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

التفحص ب __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'

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...