V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
fourstring
V2EX  ›  Python

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

  •  
  •   fourstring · 2019-02-10 15:44:15 +08:00 · 2730 次点击
    这是一个创建于 2143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    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)后并未找到有关内容。毕竟这样的需求还是经常有的,比如一个容器类的元素应该可以是这个类的实例。谢谢!

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

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

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

    注解延迟求值,Python 4 的特性之一
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.