You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求兼容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

原理说明

  1. types.FunctionType和types.MethodType覆盖Python定义的普通函数与实例绑定方法;
  2. inspect.isbuiltin()可识别Cython编译生成的函数(这类函数在Python中会被归类为内置函数类型);
  3. 额外处理classmethod和staticmethod,避免这类特殊方法被遗漏;
  4. 该逻辑不会触发类本身、实现__call__的类实例等非函数/方法的可调用对象,符合需求。

内容的提问来源于stack exchange,提问作者dsollen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:14:49