Python3.6内置函数(9)——callable()

Python的callable()函数用于检查一个对象是否可以被调用。类是可调用的,实例是否可调用取决于类是否定义了__call__()方法。如果对象不可调用并尝试调用,会引发TypeError。本文通过实例解析了callable()的用法和对象的可调用性。

英文文档

callable(object)

Return True if the object argument appearscallable, False if not. If this returns true, it is still possible that a callfails, but if it is false, calling object will never succeed. Note that classesare callable (calling a class returns a new instance); instances are callableif their class has a __call__() method.

callable()

1、方法用来检测对象是否可被调用,可被调用指的是对象能否使用()括号的方法调用。

>>> callable(callable)
True
>>> callable(1)
False
>>> 1()
Traceback (most recent call last):
  File "<pyshell#87>", line 1, in <module>
    1()
TypeError: 'int' object is not callable

 

2、可调用对象,在实际调用也可能调用失败;但是不可调用对象,调用肯定不成功。

3、类对象都是可被调用对象,类的实例对象是否可调用对象,取决于类是否定义了__call__方法。

>>> class A: #定义类A
          &

<think> 由于用户要求使用Python 3.6版本,我们需要调整代码以兼容该版本。 在Python 3.6中,asyncio.create_task()尚未引入,因此我们需要使用asyncio.ensure_future()来创建任务。 另外,asyncio.run()3.7才引入,所以我们需要自己管理事件循环。 但是,在类中管理异步任务,我们可以通过使用较低级别的API来实现。 调整点: 1. 在add_task方法中,使用asyncio.ensure_future替代asyncio.create_task。 2. 由于3.6没有asyncio.run,我们在示例中使用传统的事件循环启动方式。 3. 注意:在Python3.6中,主函数不能直接使用asyncio.run,因此我们将重写示例。 另外,我们还需要注意类型注解(typing)的使用,Python3.6支持typing,所以保留。 修改后的AsyncTaskManager类(仅修改创建任务的部分): 将 asyncio.create_task(wrapper()) 替换为 asyncio.ensure_future(wrapper()) 同时,修改使用示例,使其能在3.6上运行。 注意:在3.6中,异步生成器和其他一些特性可能还不完善,但我们的代码不涉及那些。 以下是修改后的完整代码: </think> 以下是为 Python 3.6 完全兼容的异步任务管理器实现(已适配 3.6 特有 API): ```python import asyncio from typing import Callable, Coroutine, Any, List, Dict, Optional class AsyncTaskManager: def __init__(self): self.tasks: Dict[str, asyncio.Task] = {} self.results: Dict[str, Any] = {} self.errors: Dict[str, Exception] = {} async def add_task( self, task_id: str, async_func: Callable[..., Coroutine], *args, **kwargs ) -> None: """添加并启动异步任务 (Python 3.6兼容)""" if task_id in self.tasks: raise ValueError(f"任务ID &#39;{task_id}&#39; 已存在") async def wrapper(): try: result = await async_func(*args, **kwargs) self.results[task_id] = result return result except Exception as e: self.errors[task_id] = e raise # Python 3.6使用ensure_future代替create_task self.tasks[task_id] = asyncio.ensure_future(wrapper()) async def wait_all(self) -> None: """等待所有任务完成 (Python 3.6兼容)""" # 使用return_exceptions=True避免单个任务异常中断全部 await asyncio.gather(*self.tasks.values(), return_exceptions=True) async def wait_any(self) -> str: """等待任意任务完成 (Python 3.6兼容)""" # 创建所有任务的副本集合 task_set = set(self.tasks.values()) # 使用FIRST_COMPLETED等待任意任务完成 done, _ = await asyncio.wait( task_set, return_when=asyncio.FIRST_COMPLETED ) # 查找完成的任务ID for task_id, task in self.tasks.items(): if task in done: return task_id return "" # 以下方法与Python版本无关,保持不变 def get_result(self, task_id: str) -> Any: if task_id in self.results: return self.results[task_id] raise KeyError(f"任务 &#39;{task_id}&#39; 无结果或未完成") def get_error(self, task_id: str) -> Optional[Exception]: return self.errors.get(task_id) def cancel_task(self, task_id: str) -> bool: if task_id in self.tasks: task = self.tasks[task_id] if not task.done(): task.cancel() return True return False def cancel_all(self) -> None: for task in self.tasks.values(): if not task.done(): task.cancel() def task_status(self, task_id: str) -> str: if task_id not in self.tasks: return "not_found" task = self.tasks[task_id] if task.cancelled(): return "canceled" if task.done(): return "completed" if task_id in self.results else "failed" return "running" def get_all_task_ids(self) -> List[str]: return list(self.tasks.keys()) ``` ### Python 3.6 兼容的使用示例 ```python import random async def mock_api_call(task_id: str, delay: float): """模拟异步API调用 (Python 3.6兼容)""" print(f"任务 {task_id} 开始,预计耗时: {delay:.1f}s") await asyncio.sleep(delay) if random.random() < 0.2: # 20%概率模拟失败 raise ValueError(f"任务 {task_id} 模拟错误") return f"任务 {task_id} 结果: {delay}" # Python 3.6需要显式管理事件循环 loop = asyncio.get_event_loop() async def main(): manager = AsyncTaskManager() # 添加多个任务 for i in range(5): delay = random.uniform(0.5, 2.0) await manager.add_task(f"task_{i}", mock_api_call, f"task_{i}", delay) # 等待任意任务完成 first_completed = await manager.wait_any() print(f"\n第一个完成的任务: {first_completed}") print(f"结果: {manager.get_result(first_completed)}") # 等待所有任务完成 print("\n等待剩余任务完成...") await manager.wait_all() # 输出所有结果 print("\n所有任务结果:") for task_id in manager.get_all_task_ids(): status = manager.task_status(task_id) if status == "completed": print(f"{task_id}: {manager.get_result(task_id)}") elif status == "failed": print(f"{task_id}: 失败 - {manager.get_error(task_id)}") elif status == "canceled": print(f"{task_id}: 已取消") # Python 3.6运行主函数 loop.run_until_complete(main()) loop.close() ``` ### Python 3.6 特有适配说明 1. **任务创建** - 使用 `asyncio.ensure_future()` 替代 `asyncio.create_task()` - 这是 Python 3.6 创建任务的推荐方式 2. **事件循环管理** - 显式获取事件循环:`loop = asyncio.get_event_loop()` - 使用 `loop.run_until_complete(main())` 运行主协程 - 完成后手动关闭循环:`loop.close()` 3. **等待机制** - `asyncio.wait()` 在 3.6 中行为与高版本一致 - 使用 `return_exceptions=True` 确保单个异常不影响其他任务 4. **类型注解** - Python 3.6 完全支持类型注解 - 使用 `typing` 模块确保类型安全 5. **异步函数定义** - `async def` 和 `await` 语法在 3.6 中完全支持 - 无需额外配置即可使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值