zoukankan      html  css  js  c++  java
  • mypy 支持静态类型编程的python变种

    每种编程语言都有一群固定的用户,对于那些习惯将不同编程语言用成同样的感觉的人来说,最是难受。因为每种语言都有它独特的设计『哲学』和擅长的应用领域。

    PHP给大家的一贯的印象都是动态弱类型语言,Python是动态强类型语言。

    就像我用惯了PHP的标量类型声明-起到一点静态类型的感觉,让我去用Python的完全动态,可能是不习惯的。而强类型在大型项目中,是基本质量的保证。

    mypy出现了。正如Facebook出了Hack Lang - PHP的静态类型版,mypy也是python的静态类型版;尽管两者的实现原理有所不同。

    Python编程语言的设计者Guido van Rossum,在python-ideas邮件列表中提出了一个建议:在Python函数声明中加入类型注释。这个建议旨在在不改变Python动态类型的本质和解释器行为的前提下,让Python获得静态类型系统所带来的好处。

    其目标是,在不改变程序执行逻辑的情况下,通过(未修改的)Python 3.5解释器运行时,能够对第三方模块(甚至是stdlib)添加类型检查注释。

    Guido所提出的添加类型注释的建议源自于Bob Ippolito和Jukka Lehtosalo的想法。Bob Ippolito主张将Haskell的一些特性引入到Python和其他语言中。Jukka Lehtosalo则是mypy的作者,这是一个带有试验性质的Python变种版本,旨在将动态类型和静态类型的好处结合起来。

    Mypy是Guido建议中的主要内容。在建议中,Guido说到,可以将mypy看成一个用于Python的、类似lint的静态检查器。用于在编译期或是在mypy的Python解释器下运行时,检查程序中类型的正确性。另一方面,程序在Python官方的解释器下执行时,能够不受类型注释的影响。因此也不会有运行时类型检查的开销。为了达到这一点,关键在于用于类型注释的语法必须符合Python 3的语法。这也是mypy的一个特性。实际上,mypy在指定类型签名的时候使用了函数注释这个Python 3的语法。该语法允许为函数添加任意元数据注释。

    def f(t: Tuple[int, str]) -> None:
        t = 1, 'foo'    # OK
        t = 'foo', 1    # Type check error
    
    def greeting(name: str) -> str:
        if name:
            return 'Hello, {}'.format(name)
        else:
            return 'Hello, stranger'
    
    print(greeting('Python'))  # Okay!
    print(greeting(None))      # Also okay!
    
    class A:
        def __init__(self, x: int) -> None:
            self.x = x     # Attribute x of type int
    
    a = A(1)
    a.x = 2       # OK
    a.y = 3       # Error: A has no attribute y
    

    随着python3.6的发布,python的注解规范已经支持变量类型标注:

    primes: List[int] = []
    
    captain: str  # Note: no initial value!
    
    class Starship:
        stats: ClassVar[Dict[str, int]] = {}
    
    

    python3中,这些类型注解只会在运行类型检测时提示,实际运行的时候不会发生作用。

  • 相关阅读:
    Git教程
    Android 使用AIDL调用外部服务
    Android 不同文件名介绍
    详解Android首选项框架ListPreference
    Android 使用Telephony API
    Android ImageButton android:scaleType
    Java实现二维码QRCode的编码和解码
    java二维码生成与解析代码实现
    Java中转UTC时间字符串(含有T Z)为local时间
    http://www.yihaomen.com/article/java/302.htm
  • 原文地址:https://www.cnblogs.com/x3d/p/6523674.html
Copyright © 2011-2022 走看看