• 1

كيف يمكنني معرفة أن المتغير هو دالة في البايثون ؟

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

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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
>>> 

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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__() "__إستدعاء__()".

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

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن