python中callable什么意思_Python中的callable是基于什么样的机制实现的

本文详细介绍了Python内置函数callable()的工作原理,通过源码分析展示了如何判断一个对象是否可调用。主要内容包括:callable()在检测类和实例时的判断依据,如类需具备__call__方法,方法需有tp_call属性。并提供了示例代码展示其用法,例如类a定义了__call__方法故为可调用,而类b没有则不可调用。
部署运行你感兴趣的模型镜像

如题,在Python中有这样的方法callable,判断一个对象是否可以调用。

callable(object)

中文说明:检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

看看源码

int

PyCallable_Check(PyObject *x)

{

if (x == NULL)

return 0;

if (PyInstance_Check(x)) {

PyObject *call = PyObject_GetAttrString(x, "__call__");

if (call == NULL) {

PyErr_Clear();

return 0;

}

/* Could test recursively but don't, for fear of endless recursion if some joker sets self.__call__ = self */

Py_DECREF(call);

return 1;

}

else {

return x->ob_type->tp_call != NULL;

}

}

其中

int PyInstance_Check(PyObject *obj)

Return true if obj is an instance.

判断是否为一个对象

对于最后一个else中

ternaryfunc PyTypeObject.tp_call

An optional pointer to a function that implements calling the object. This should be NULL if the object is not callable. The signature is the same as for PyObject_Call().

This field is inherited by subtypes.

指向函数的指针,用于callable检测

所以当用callable来检测一个类是否可调用,需要这个类有__call__,如果是一个方法,检测其tp_call。

两个比较

class a:

def __call__(slef):

pass

oa = a()

oa()

callable(oa)

结果为true

class b:

def _init__(self):

pass

ob=b()

callable(ob)

结果为false

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### `Callable` 是什么? 在 Python 中,`Callable` 是一个来自 `typing` 模块的**类型提示(type hint)**,用于表示“某个对象是可调用的”,比如函数、方法、lambda 表达式、类(因为可以实例化)、或任何实现了 `__call__()` 方法的对象。 它主要用于 **类型注解中**,告诉开发者或类型检查器:这个参数 / 变量 应该是一个“能被调用”的对象(即后面可以加 `()` 来执行)。 --- ### ✅ 基本语法 ```python from typing import Callable def apply_func(func: Callable[[int, int], int], a: int, b: int) -> int: return func(a, b) ``` - `Callable[[int, int], int]` 含义: - 第一个 `[int, int]`:表示该函数接受两个 `int` 类型参数。 - 第二个 `int`:表示该函数返回一个 `int` 类型值。 - 所以整体意思是:“传进来的是一个接收两个整数并返回一个整数的函数”。 --- ### ✅ 示例:使用普通函数作为参数 ```python from typing import Callable def add(x: int, y: int) -> int: return x + y def apply_operation(op: Callable[[int, int], int], a: int, b: int) -> int: return op(a, b) # 使用 result = apply_operation(add, 3, 4) print(result) # 输出: 7 ``` ✅ 这里 `add` 是一个符合 `Callable[[int, int], int]` 类型的函数。 --- ### ✅ 更灵活的用法 #### 1. 接收无参函数 ```python from typing import Callable def run_something(task: Callable[[], None]) -> None: task() def say_hello() -> None: print("Hello!") run_something(say_hello) ``` #### 2. 接收有返回值的无参函数 ```python from typing import Callable def get_value(provider: Callable[[], str]) -> str: return provider() get_name = lambda: "Alice" print(get_value(get_name)) # 输出: Alice ``` #### 3. 接收任意参数和返回类型的函数(泛用场景) ```python from typing import Callable, Any # 表示任意可调用对象,不关心参数和返回类型 handler: Callable[..., Any] = some_function ``` > ⚠️ 注意:`...` 在这里不是省略号,而是特殊语法,表示“任意数量和类型的参数”。 --- ### ✅ Lambda 和其他可调用对象也适用 ```python from typing import Callable square: Callable[[int], int] = lambda x: x ** 2 print(square(5)) # 输出: 25 ``` 也可以是类(如果可调用): ```python class Multiplier: def __init__(self, factor): self.factor = factor def __call__(self, x: int) -> int: return x * self.factor double = Multiplier(2) apply_callable: Callable[[int], int] = double print(apply_callable(5)) # 输出: 10 ``` --- ### ✅ Python 3.9+ 的变化:内置 `collections.abc.Callable` 从 Python 3.9 开始,你可以直接使用 `collections.abc.Callable` 而无需导入 `typing.Callable`(但两者仍兼容): ```python # Python 3.9+ from collections.abc import Callable def my_func(callback: Callable[[str], None]) -> None: callback("Hi") ``` --- ### 🔍 常见用途 | 场景 | 说明 | |------|------| | 回调函数 | 如 GUI 编程、异步任务、事件处理 | | 高阶函数 | 函数接收函数作为参数(如 map, filter, 自定义装饰器) | | 依赖注入 / 工厂模式 | 传递构造函数或生成器函数 | | 类型安全 | 结合 mypy 检查是否传了错误类型的“函数” | --- ### ❗ 常见误区 | 误解 | 正确解释 | |------|----------| | `Callable` 是一种函数类型 | 实际上它是“可调用对象”的类型提示,包括函数、类、实例等 | | 不写 `Callable` 就不能传函数 | 错!Python 动态特性允许你传任何东西,但类型提示帮助预防错误 | | `Callable` 会影响运行性能 | 不会!类型注解在运行时被忽略 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值