zoukankan      html  css  js  c++  java
  • Python3的高级用法之类型提示

    Python3的高级用法之类型提示

    是不是曾经看到过类似这样的代码

    def greeting(name: str) -> str:
        return 'Hello ' + name
    

    感觉很高大上。

    这其实是Python3.5版本开始的一个新功能,类型提示。这个代码的意思就是,提示你输入参数name的值是str类型,返回值也是str类型。

    以下参考官方文档。

    类型别名

    from typing import List
    Vector = List[float]
    
    def scale(scalar: float, vector: Vector) -> Vector:
        return [scalar * num for num in vector]
    
    # typechecks; a list of floats qualifies as a Vector.
    new_vector = scale(2.0, [1.0, -4.2, 5.4])
    

    把list里面放float类型,并且取个新名字叫Vector

    取别名在限定复杂的参数类型的时候很有用,比如以下代码

    from typing import Dict, Tuple, List
    
    ConnectionOptions = Dict[str, str]
    Address = Tuple[str, int]
    Server = Tuple[Address, ConnectionOptions]
    
    def broadcast_message(message: str, servers: List[Server]) -> None:
        ...
    
    # The static type checker will treat the previous type signature as
    # being exactly equivalent to this one.
    def broadcast_message(
            message: str,
            servers: List[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
        ...
    

    自己定义类型

    from typing import NewType
    UserId = NewType('UserId', int)
    some_id = UserId(524313)
    

    自己定义了一个UserId类型

    这个有啥用呢?继续看一个代码

    def get_user_name(user_id: UserId) -> str:
        ...
    
    # 正常
    user_a = get_user_name(UserId(42351))
    
    # 直接传-1也没事,不进行类型检查。  
    user_b = get_user_name(-1)
    

    -1虽说是int类型,但是,不是UserId类型,直接传-1也不会报错,静态检查器会把新类型看成为原始类型的子类,这样有助于处理逻辑错误。

    新定义的UserId类型也能执行int类型的运算

    # 'output' 是int类型,而不是UserId类型
    output = UserId(23413) + UserId(54341)
    

    注意:这里为啥最后output是int类型,官方解释是,自己定义的类型仅由静态类型检查器强制执行,但是运行时会立马返回原始类型(也就是int类型),这也就意味着不能直接创建UserId的子类型,因为他是运行时的标识函数,而不是实际类型

    看一下这个小例子

    def test(name: str) -> str:
        return (1,2)
    
    test([1,2,3])
    

    看这里,要求输入是str类型,我强行输入的是一个list,要求返回的是str,我强行返回的是一个tuple,但是这个代码并不报错,而且返回的类型是tuple而不是指定的str

    我的理解是,这个只是一个标注作用,目前来说就是提示别人调用我的函数的人,我的参数类型是什么,返回值的类型是什么。就是一个提示作用,并不会对这些类型进行匹配检查。后期我觉得官方可能会强制要求类型必须匹配,也许不会(不然有点像java的感觉了)。

  • 相关阅读:
    DELPHI中GetTickCount 函数的应用
    Delphi 中 StrToIntDef 函数的应用
    TeeChart 动态建曲线
    历遍指定文件夹下的文件
    DELPHI 获取错误信息
    delphi播放flash
    C# 获取当前路径方法
    DELPHI 修改系统分辨率
    SQL字符串处理函数 Yang
    Linux基本操作 Yang
  • 原文地址:https://www.cnblogs.com/realwuxiong/p/13533822.html
Copyright © 2011-2022 走看看