التحقق من الأنواع في Python: شرح شامل لاستخدام type() و isinstance() وأساليب أخرى

1. المقدمة

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

2. نظرة عامة على أنواع البيانات في Python

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

أهم أنواع البيانات

  • الأنواع العددية (int, float) تتضمن الأعداد الصحيحة int والأعداد العشرية float.
  num1 = 10
  num2 = 3.14
  print(type(num1))  # <class 'int'>
  print(type(num2))  # <class 'float'>
  • السلاسل النصية (str) تُستخدم لتخزين النصوص، وتُعرّف باستخدام علامات اقتباس مفردة أو مزدوجة.
  text = "Hello, World!"
  print(type(text))  # <class 'str'>
  • القوائم (list) القائمة عبارة عن مجموعة مرتبة يمكنها تخزين عناصر متعددة وتُعرّف باستخدام [].
  mylist = [1, 2, 3, 4]
  print(type(mylist))  # <class 'list'>
  • القواميس (dict) تُستخدم لتخزين البيانات كأزواج مفتاح-قيمة، وتُعرّف باستخدام {}.
  mydict = {"one": 1, "two": 2}
  print(type(mydict))  # <class 'dict'>
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. التحقق باستخدام type()

تُستخدم دالة type() للحصول على نوع الكائن المحدد. إنها أداة بسيطة وفعالة لمعرفة نوع المتغير.

الاستخدام الأساسي لدالة type()

في المثال التالي نتحقق من نوع المتغير:
myvar = 1234
print(type(myvar))  # <class 'int'>
يمكن التحقق من الأنواع الأخرى بنفس الطريقة:
mystr = "Hello"
print(type(mystr))  # <class 'str'>

مزايا وقيود type()

على الرغم من بساطتها، فإن type() لا تأخذ الوراثة في الاعتبار، إذ تتحقق فقط من التطابق المباشر:
class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(type(dog) == Animal)  # False
في هذه الحالة، رغم أن Dog يرث من Animal، إلا أن type() تُرجع False. لهذا يُفضل استخدام isinstance() في مثل هذه الحالات.

4. التحقق باستخدام isinstance()

تُستخدم دالة isinstance() للتحقق مما إذا كان الكائن من نوع معين أو من فئاته الفرعية، مما يجعلها أكثر مرونة.

الاستخدام الأساسي لـ isinstance()

myvar = 1234
print(isinstance(myvar, int))  # True

التحقق من أنواع متعددة

يمكن تمرير عدة أنواع في شكل tuple:
value = 3.14
print(isinstance(value, (int, float)))  # True

التحقق من الوراثة

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(isinstance(dog, Animal))  # True

5. طرق أخرى للتحقق من الأنواع

بالإضافة إلى type() و isinstance()، هناك طرق أخرى مثل:

issubclass()

تتحقق مما إذا كانت فئة فرعية من فئة أخرى:
class Animal:
    pass

class Dog(Animal):
    pass

print(issubclass(Dog, Animal))  # True

collections.abc

مفيد للتحقق من الأنواع الخاصة بمجموعات البيانات مثل القوائم:
import collections.abc

mylist = [1, 2, 3]
print(isinstance(mylist, collections.abc.Sequence))  # True

typing

يُستخدم لإضافة التلميحات النوعية (Type Hints) التي تساعد في تحسين قابلية القراءة والاكتشاف المبكر للأخطاء:
from typing import List

def greet(names: List[str]) -> None:
    for name in names:
        print(f"Hello, {name}!")

التحقق من نوع NoneType

myvar = None
print(type(myvar))  # <class 'NoneType'>
يُستخدم هذا النوع للتحقق من القيم الفارغة (None) خصوصًا عند التحقق من القيم المرجعة من الدوال.