为weakref对象列表定义Python类型提示

问题描述 投票:0回答:1

我还没有找到如何在使用弱引用时给出类型提示指示。

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
weakref
MyObject
,比如:

my_list: List[Weakref[MyObject]] = [weakref.ref(o1), weakref.ref(o2)]

python python-typing weak-references
1个回答
15
投票

我们可以通过查阅 typeshed 来找到此信息,它是标准库和一些流行的第三方模块的类型提示存储库。

具体来说,如果我们查看

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]"] = [...]
© www.soinside.com 2019 - 2024. All rights reserved.