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

كيفية التحقق مما إذا كان كائن قابل للتكرار أم لا في بايثون؟

Fahmy Mostafa

السؤال

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...