前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python类型注解

python类型注解

作者头像
py3study
发布2020-01-10 10:54:58
7140
发布2020-01-10 10:54:58
举报
文章被收录于专栏:python3python3

函数注解Function Annotations

函数注解

    Python 3.5引入

    对函数的参数进行类型注解

    对函数的返回值进行类型注解

    只对函数参数做一个辅助的说明,并不对函数参数进行类型检查

    提供给第三方工具,做代码分析,发现隐藏bug

    函数注解的信息,保存在__annotations__属性中

业务应用

函数参数类型检查

思路

    函数参数的检查,一定是在函数外

    函数作为参数,传入到检查函数中

    检查函数拿到函数传入的实际参数,与形参声明对比

    __annotations__属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无法和字典中的声明对应。使用inspect模块

inspect模块

提供获取对象信息的函数,可以检查函数的类、类型检查

signature(callable),获取签名(函数签名包括了一个函数的信息,包括函数名、它的参数类型、他所在的类和名称空间及其他信息)

import inspect

def add(x:int,y:int,*args,**kwargs) -> int:

    return x + y

sig = inspect.signature(add)

print(sig,type(sig))

print('params:',sig.parameters)

print(sig.parameters['y'],type(sig.parameters['y']))

print(sig.parameters['x'].annotation)

print(sig.parameters['args'])

print(sig.parameters['args'].annotation)

print(sig.parameters['kwargs'])

print(sig.parameters['kwargs'].annotation)

sig.parameters 是一个OrderedDict 

inspect模块

inspect.isfunction(add),是否是函数

inspect.isfunction(add),是否是函数 inspect.ismethod(add)),是否是类的方法 inspect.isgenerator(add)),是否是生成器对象 inspect.isgeneratorfunction(add)),是否是生成器函数  inspect.isclass(add)),是否是类 

inspect.ismodule(inspect)),是否是模块 inspect.isbuiltin(print)),是否是内建对象

inspect模块

Parameter对象

    保存在元组中,是只读的

    name,参数的名字

    annotation,参数的注解,可能没有定义

    default,参数的缺省值,可能没有定义

    empty,特殊的类,用来标记default属性或者注释annotation属性的空值

kind,实参如何绑定到形参,就是形参的类型

业务应用练习

有函数add

请检查用户输入是否符合参数注解的要求

import inspect

def check(fn):

    def wrapper(*args,**kwargs):

        sig = inspect.signature(fn)

        param = sig.parameters

        values = list(param.values())

        for i,v in enumerate(args):

            if values[i].annotation is not inspect._empty  and not isinstance(v,values[i].annotation):

                print('!==')

        for k,t in kwargs.items():

            if param[k].annotation is not inspect._empty   and not isinstance(t,param[k].annotation):

                print('!===')

        ret = fn(*args,**kwargs)

        return ret

    return wrapper

@check

def add(x:int,y:int=7)-> int:

    return x + y

print(add(1.1,y=1.0))

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档