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中,这些类型注解只会在运行类型检测时提示,实际运行的时候不会发生作用。

  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/x3d/p/6523674.html
Copyright © 2011-2022 走看看