推荐学习书目
› 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 · Feb 10, 2019 · 3783 views
    This topic created in 2787 days ago, the information mentioned may be changed or developed.

    代码如下:

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

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

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

    注解延迟求值,Python 4 的特性之一
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   860 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:36 · PVG 05:36 · LAX 14:36 · JFK 17:36
    ♥ Do have faith in what you're doing.