ali_agha نشر 10 أكتوبر 2015 أرسل تقرير نشر 10 أكتوبر 2015 لنفترض أن لدي المتغير x وأريد معرفة هل هذا المتغير يشير إلى دالة أو لا، حاولت استخدام تابع isinstance لكن لم ينجح الأمر، فما هي الطريقة الصحيحة لمعرفة دالة معينة في البايثون ؟ 1 اقتباس
1 هشام رزق الله نشر 18 فبراير 2016 أرسل تقرير نشر 18 فبراير 2016 بتاريخ 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 هشام رزق الله نشر 17 فبراير 2016 أرسل تقرير نشر 17 فبراير 2016 يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال التأكد إذا كان هذا الكائن يملك سمة __call__ كما في المثال التالي: hasattr(x, '__call__') ويمكنك فعل ذلك عن طريق isinstance وذلك عن طريق استدعاء مكتبة types التي تحتوي على جميع أنواع الكائنات ومن ثم استخدامها كما في الأمثلة التالية: isinstance(f, types.FunctionType) أو: isinstance(lambda x : None, types.FunctionType) اقتباس
0 samer_jabal نشر 17 فبراير 2016 أرسل تقرير نشر 17 فبراير 2016 بتاريخ 13 ساعات قال هشام رزق الله: يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال التأكد إذا كان هذا الكائن يملك سمة __call__ كما في المثال التالي: hasattr(x, '__call__') ويمكنك فعل ذلك عن طريق isinstance وذلك عن طريق استدعاء مكتبة types التي تحتوي على جميع أنواع الكائنات ومن ثم استخدامها كما في الأمثلة التالية: isinstance(f, types.FunctionType) أو: isinstance(lambda x : None, types.FunctionType) أعتقد أنك نسيت الدالة المدمجة callable() لمحة عن الدالة: ============================ قابل للإستدعاء(كائن) callable(object) تعود بصح True إذا ظهر أن الكائن الجَدَلي قابل للإستدعاء، خطأ False إذا كان غير ذلك. إذا عاد هذا بصح، فلا يزال هناك إحتمال بأن الإستدعاء فشل، لكن إذا كان خطأ، فإن إستدعاء الكائن لن ينجح أبدا. لاحظ أن الأصناف قابلة للإستدعاء(إستدعاء صنف ما يعود بأنموذج instance جديد)؛ تكون نماذج الصنف قابلة للإستدعاء إذا إمتلكت الوسيلة/الأداة __call__() "__إستدعاء__()". ============================ اقتباس
السؤال
ali_agha
لنفترض أن لدي المتغير x وأريد معرفة هل هذا المتغير يشير إلى دالة أو لا، حاولت استخدام تابع isinstance لكن لم ينجح الأمر، فما هي الطريقة الصحيحة لمعرفة دالة معينة في البايثون ؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.