为创建跨进程共享对象的函数添加正确的类型提示
创建跨进程共享对象的函数添加正确的类型提示
这个函数是用来通过multiprocessing.managers.BaseManager创建跨进程共享对象的,要给它加上准确的类型提示,咱们可以用泛型类型来保证通用性和类型安全,具体实现如下:
首先,我们需要导入typing模块里的TypeVar和Callable来实现泛型支持,然后给函数加上类型标注:
from typing import TypeVar, Callable # 定义泛型类型变量,代表构造函数返回的实例类型 T = TypeVar('T') def create_shared_object(constructor: Callable[..., T]) -> T: from multiprocessing.managers import BaseManager BaseManager.register('name', constructor) manager = BaseManager() manager.start() return manager.name()
类型提示的解释:
T = TypeVar('T'):定义一个泛型类型变量T,它可以代表任意类型,这样我们的函数就能适配各种不同的构造函数,不管它返回的是什么类型的实例。constructor: Callable[..., T]:这里标注constructor是一个可调用对象(比如类本身,因为类的实例化过程就是调用类),...表示它可以接受任意数量、任意类型的参数,最终返回T类型的实例。-> T:函数的返回类型标注为T,虽然manager.name()实际返回的是一个跨进程代理对象,但这个代理对象会完全转发原对象的方法和属性,在类型检查时可以当作原类型T来处理,这样代码的类型提示会更友好。
如果你的构造函数有明确的参数列表,还可以把Callable[..., T]改成更具体的形式,比如构造函数需要int和str类型的参数,返回MyClass实例,那可以写成Callable[[int, str], MyClass],不过Callable[..., T]是更通用的写法,适合大多数场景。
备注:内容来源于stack exchange,提问作者isa-2d
相关产品推荐
相关产品推荐

