Python 中是否不允许将一个类的方法的参数的类型注解为该类型本身?

2019-02-10 15:44:15 +08:00
 fourstring

代码如下:

class A:
    def __init__(self,a:A):
        pass

Python 版本(Anaconda):Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32

这段代码运行时就会触发NameError:name 'A' is not defined异常。那么这个异常的引发是因为解释器本身的限制还是因为写法有误?我查阅官方文档(PEP 3107)后并未找到有关内容。毕竟这样的需求还是经常有的,比如一个容器类的元素应该可以是这个类的实例。谢谢!

2721 次点击
所在节点    Python
10 条回复
Mohanson
2019-02-10 15:51:06 +08:00
对的,使用 a: 'A' 即可: 注解类型加单引号。
Mohanson
2019-02-10 15:52:45 +08:00
同理可以注解未定义的类型,例子: https://github.com/mohanson/pywasm/blob/master/pywasm/execution.py#L46
fourstring
2019-02-10 15:57:11 +08:00
@Mohanson #1 那这样的话您使用的 ide 会有代码提示吗?我用的 PyCharm 2018.3 似乎在接下来的编码中并不会提示我 a 是一个 A 类型的变量(比如输入 a.不会提示成员)
fourstring
2019-02-10 15:59:42 +08:00
@Mohanson #1 不好意思打扰了,我刚刚的问题在于对 A 的内部类 B 进行注解的时候没有使用'A.B',而是使用了'B',最后请教一些单引号注释类型是在何处规定的呢?
Mohanson
2019-02-10 16:03:14 +08:00
@fourstring 目前是没有的
Trim21
2019-02-10 16:05:13 +08:00
@fourstring #4 python 里单引号和双引号没什么区别, 也有提示

是不是因为你这个例子里 A 也没什么其他方法, 所以没有提示...

Mohanson
2019-02-10 16:09:00 +08:00
Mohanson
2019-02-10 16:11:37 +08:00
因为官方都是这么用,我其实也没细究原始出处
thautwarm
2019-02-10 16:16:09 +08:00
from __future__ import annotations
就可以了。
不默认支持是因为这个会 break 一些特殊的包。
CSM
2019-02-10 23:03:49 +08:00
https://www.python.org/dev/peps/pep-0563/

注解延迟求值,Python 4 的特性之一

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

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

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

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

© 2021 V2EX