Python 类中类型提示使用“定义类”提示未定义

2021-09-09 20:54:00 +08:00
 ves

如图,最后那个 Card 提示未定义,这有什么解决办法吗

1707 次点击
所在节点    Python
10 条回复
ves
2021-09-09 21:19:30 +08:00
ClericPy
2021-09-09 22:45:50 +08:00
加上引号
ipwx
2021-09-10 01:07:52 +08:00
def create_from_shortstr(cls, ss: str) -> 'Card':


不过这种我建议不要加 -> Card,因为其实是 classmethod 返回的是 cls()。也不要用 Generic[T],这样很麻烦。
Trim21
2021-09-10 07:55:20 +08:00
这里不应该用 Generic[T],可以月 TypeVar

Trim21
2021-09-10 07:57:52 +08:00
你这个方法在类型上返回的也不是 Card 。如果 Card 是 List[str],那你这个方法的返回值就是 str
Trim21
2021-09-10 08:03:06 +08:00
@Trim21 #5 这个是说你在#1 的写的 Generic[T]和 T
Acebiu
2021-09-10 08:41:59 +08:00
如果不需要兼容 3.7 以下的版本的话也可以使用

```python
from __future__ import annotations
```

https://docs.python.org/3/library/__future__.html
popil1987
2021-09-10 08:44:41 +08:00
可以把 create_from_shortstr 单独作为一个“工厂函数”,让它:
返回 Card 类本身
返回 Card 对象,根据传入参数
返回 Card 类,使用 Type 对类进行构造
2i2Re2PLMaDnghL
2021-09-10 09:38:22 +08:00
推荐 ponylang 的,可以定义多个不同构造器函数。

怎么就没有一个 @constructor 或者 @initiator 修饰器呢,这样函数的签名也跟 __init__ 一致。
ves
2021-09-10 21:36:05 +08:00
@ipwx 感谢,不加是正解。

正因为是 classmethod 返回的,而 classmethod 使用的是泛型,所以 IDE 也能正确提示。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX