python - 为弱引用对象列表定义 python 类型提示
问题描述
我还没有找到在使用弱引用时如何给出类型提示指示。
from typing import List
import weakref
class MyObject:
def __init(self, foo)
self.foo = foo
o1 = MyObject(1)
o2 = MyObject(2)
my_list: List[weakref] = [weakref.ref(o1), weakref.ref(o2)]
有没有办法说这my_list
是一个list
to weakref
,MyObject
比如:
my_list: List[Weakref[MyObject]] = [weakref.ref(o1), weakref.ref(o2)]
?
解决方案
我们可以通过咨询typeshed找到这些信息,typeshed是标准库的类型提示库和一些流行的 3rd 方模块。
具体来说,如果我们查看weakref
模块ref
的存根,我们可以看到它从_weakref
模块中重新导出。从那里,我们看到它ref
被定义为等同于ReferenceType
类,它被定义为泛型(并且也是从 重新导出的weakref
)。
将这些部分放在一起,我们可以为您的my_list
变量提供如下所示的类型提示:
from __future__ import annotations
from typing import List
from weakref import ref, ReferenceType
# ...snip...
my_list: List[ReferenceType[MyObject]] = [...]
有点有趣的是,这样做也可以:
from __future__ import annotations
from typing import List
from weakref import ref
# ...snip...
my_list: List[ref[MyObject]] = [...]
基本上,ref
它也是一个别名,ReferenceType
因此我们可以互换使用这两种类型。
我个人会使用ReferenceType
,但这主要是因为我习惯于以大写字母开头的类型。(或者,如果该类型提示开始变得过于冗长,我可能会定义一个自定义类型别名Ref = ReferenceType
)。
请注意,该from __future__ import annotations
行仅在 Python 3.7+ 上可用。如果您使用的是旧版本的 Python,则需要手动将类型提示设为字符串:
from typing import List
from weakref import ref
# ...snip...
my_list: "List[ReferenceType[MyObject]]" = [...]
# Or:
my_list: List["ReferenceType[MyObject]"] = [...]
推荐阅读
- sas - SAS 中 Fisher 检验的优势比和置信限
- python - 删除所有满足正则表达式条件的行
- php - php - 从用户那里撤回 exp
- php - 如何在php查询中第二次停止相同的数据显示?
- swift - 如何在swift中使用函数成员指针?
- python-2.7 - tensorflow.control_dependecy 究竟是如何应用的?
- visual-studio-code - 如何在不影响编辑器内代码字体大小的情况下使 Visual Studio 代码侧边栏更小
- qt - 编译 Dolphin 模拟器 beta
- python - 字典附加到列表中
- excel - Vlookup 公式问题