هل هناك طريقة شائعة للتحقق في بايثون مما إذا كان الكائن من أي نوع دالة؟
سؤال
لدي وظيفة في Python تتكرر على السمات التي تم إرجاعها من dir(obj)، وأريد التحقق لمعرفة ما إذا كان أي من الكائنات الموجودة بداخلها عبارة عن وظيفة أو طريقة أو وظيفة مدمجة وما إلى ذلك.عادةً يمكنك استخدام callable() لهذا الغرض، لكنني لا أرغب في تضمين الفئات.أفضل ما توصلت إليه حتى الآن هو:
isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))
هل هناك طريقة أكثر إثباتًا للمستقبل لإجراء هذا الفحص؟
يحرر: لقد أخطأت من قبل عندما قلت:"عادة يمكنك استخدام Callable () لهذا ، لكنني لا أريد استبعاد الفصول." أنا في الواقع يفعل تريد استبعاد الطبقات.أريد أن تطابق فقط الوظائف وليس الطبقات.
المحلول
تحتوي وحدة الفحص على ما تريده بالضبط:
inspect.isroutine( obj )
وللعلم الكود هو:
def isroutine(object):
"""Return true if the object is any kind of function or method."""
return (isbuiltin(object)
or isfunction(object)
or ismethod(object)
or ismethoddescriptor(object))
نصائح أخرى
إذا كنت تريد استبعاد الفئات والكائنات العشوائية الأخرى التي قد تحتوي على ملف __call__
الطريقة، والتحقق فقط من الوظائف والأساليب، هذه الوظائف الثلاث في inspect
وحدة
inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)
يجب أن تفعل ما تريد بطريقة مقاومة للمستقبل.
if hasattr(obj, '__call__'): pass
يتناسب هذا أيضًا بشكل أفضل مع فلسفة "كتابة البطة" في بايثون، لأنك لا تهتم حقًا ماذا إنه كذلك، طالما يمكنك تسميته.
ومن الجدير بالذكر أن callable()
تتم إزالتها من Python وهي غير موجودة في الإصدار 3.0.
اعتمادًا على ما تقصده بـ "الطبقة":
callable( obj ) and not inspect.isclass( obj )
أو:
callable( obj ) and not isinstance( obj, types.ClassType )
على سبيل المثال، تختلف النتائج لـ "dict":
>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True