寻求兼容Cython的inspect.isfunction与inspect.ismethod等效实现
兼容Python与Cython函数/方法的判断逻辑
问题分析
原代码通过inspect.isfunction()和inspect.ismethod()判断对象是否为函数/方法,但Linux环境下的Cython编译方法无法被这两个函数识别,导致跨平台逻辑不一致;同时callable()不可用,因为存在非函数/方法的可调用对象(如实现__call__的类实例)会误触发逻辑。
解决方案
使用以下兼容逻辑,无需专门针对Cython做特殊判断,即可同时识别Python原生函数/方法与Cython编译的函数/方法,且排除非目标可调用对象:
import inspect import types def is_func_or_method(obj): # 匹配Python原生函数、绑定方法 if isinstance(obj, (types.FunctionType, types.MethodType)): return True # 匹配内置函数/方法(含Cython编译的函数) if inspect.isbuiltin(obj): return True # 匹配类方法、静态方法 if isinstance(obj, (classmethod, staticmethod)): return True return False
将原代码替换为:
if is_func_or_method(type): # do stuff
原理说明
types.FunctionType和types.MethodType覆盖Python定义的普通函数与实例绑定方法;inspect.isbuiltin()可识别Cython编译生成的函数(这类函数在Python中会被归类为内置函数类型);- 额外处理
classmethod和staticmethod,避免这类特殊方法被遗漏; - 该逻辑不会触发类本身、实现
__call__的类实例等非函数/方法的可调用对象,符合需求。
内容的提问来源于stack exchange,提问作者dsollen
相关产品推荐
相关产品推荐

