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

السؤال

نشر

لنفترض أن لدي المتغير x وأريد معرفة هل هذا المتغير يشير إلى دالة أو لا، حاولت استخدام تابع isinstance لكن لم ينجح الأمر، فما هي الطريقة الصحيحة لمعرفة دالة معينة في البايثون ؟

Recommended Posts

  • 0
نشر

يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال التأكد إذا كان هذا الكائن يملك سمة __call__ كما في المثال التالي:

hasattr(x, '__call__')

ويمكنك فعل ذلك عن طريق isinstance وذلك عن طريق استدعاء مكتبة types التي تحتوي على جميع أنواع الكائنات ومن ثم استخدامها كما في الأمثلة التالية:

isinstance(f, types.FunctionType)

أو:

isinstance(lambda x : None, types.FunctionType)

 

  • 0
نشر
بتاريخ 13 ساعات قال هشام رزق الله:

يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال التأكد إذا كان هذا الكائن يملك سمة __call__ كما في المثال التالي:


hasattr(x, '__call__')

ويمكنك فعل ذلك عن طريق isinstance وذلك عن طريق استدعاء مكتبة types التي تحتوي على جميع أنواع الكائنات ومن ثم استخدامها كما في الأمثلة التالية:


isinstance(f, types.FunctionType)

أو:


isinstance(lambda x : None, types.FunctionType)

 

أعتقد أنك نسيت الدالة المدمجة callable()

لمحة عن الدالة:

============================

قابل للإستدعاء(كائن)
callable(object)

تعود بصح True إذا ظهر أن الكائن الجَدَلي قابل للإستدعاء، خطأ False إذا كان غير ذلك. إذا عاد هذا بصح، فلا يزال هناك إحتمال بأن الإستدعاء فشل، لكن إذا كان خطأ، فإن إستدعاء الكائن لن ينجح أبدا. لاحظ أن الأصناف قابلة للإستدعاء(إستدعاء صنف ما يعود بأنموذج instance جديد)؛ تكون نماذج الصنف قابلة للإستدعاء إذا إمتلكت الوسيلة/الأداة __call__() "__إستدعاء__()".

============================

  • 1
نشر
بتاريخ 9 ساعات قال samer_jabal:

أعتقد أنك نسيت الدالة المدمجة callable()

لمحة عن الدالة:

============================

قابل للإستدعاء(كائن)
callable(object)

تعود بصح True إذا ظهر أن الكائن الجَدَلي قابل للإستدعاء، خطأ False إذا كان غير ذلك. إذا عاد هذا بصح، فلا يزال هناك إحتمال بأن الإستدعاء فشل، لكن إذا كان خطأ، فإن إستدعاء الكائن لن ينجح أبدا. لاحظ أن الأصناف قابلة للإستدعاء(إستدعاء صنف ما يعود بأنموذج instance جديد)؛ تكون نماذج الصنف قابلة للإستدعاء إذا إمتلكت الوسيلة/الأداة __call__() "__إستدعاء__()".

============================

في الحقيقة إذا أردنا الإجابة على السؤال بطريقة دقيقة فإن الجواب الصحيح سيكون عبر طريقة isinstance التي وضعتها، فطريقة hasattr و callable لا تفرق بين دالة وصنف كما في المثال التالي:

>>> class Spam(object):
...     def __call__(self):
...             return 'OK'
... 
>>> cannn = Spam()
>>> import types
>>> isinstance(cannn, types.FunctionType)
False
>>> hasattr(cannn, '__call__')
True
>>> callable(cannn)
True
>>> 

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...