python类型检查

Promises的Python项目详细描述


https://travis-ci.org/eugene-eeo/promises.png?branch=masterhttp://pypip.in/v/Promises/badge.pnghttps://pypip.in/d/Promises/badge.png

Promises是一个用于 动态地保持清醒 打字语言。你可以很容易地申报 函数的签名使用 装饰工:

from promises import accepts, returns

# implement f(x) = x + 1
@accepts(int)
@returns(int)
def f(x):
    return x+1

喜欢吗?

可以通过pip安装库 或者只是克隆github存储库 为了在您的项目中使用它:

$ pip install Promises

文档

新的promises库公开 很少有被认为是 必要的,我会在 如果对它们的需求是 现在。

接受

装潢师采取任意 位置和关键字的数目 参数,将使用哪些类型 测试通过的对象。 变量名映射完成 很自然,所以不用担心。

@accepts(list,int)definc_last(array,inc=1):iflen(array)==0:array.append(0)array[-1]+=inc

注意,你现在可以使用traits 作为可接受类型的一部分, 所以你不需要分开 为了使用 特征系统:

@accepts(list,Each(int))defappend_integers(array,*nums):foriteminnums:array.append(item)

返回

声明修饰的函数 将返回特定类型,因为 示例:

@returns(int,float)defdiv(x,y):returnx/y

从0.6.18开始returns 将开始支持使用 有很多特点。注:支持退货 遍历的函数 元组,您可以执行以下操作:

frompromises.trait.specimportSequence@returns(Sequence(int,bool))defis_zero(x):x=int(x)returnx,x==0

拒绝

^{tt3}的逻辑补码$ 函数,如果 传入的对象对应于 所需的类型。例如,到 实现一个分组函数 强制用户覆盖所有可能的 案例:

@rejects(defaultdict)defgroup(g,datum):registry=defaultdict(list)foritemindatum:forgroup,matching.items():ifmatch(item):registry[group].append(item)returnregistry

Kwoly

声明函数将需要 调用时给定的关键字参数, 如果他们被 关键字参数,意味着您将 定义一些默认值。

@requires('config')deflint(config="filename"):# do something here

注意:如果您使用的是python 3,那么 方法是使用“*”符号,比如 以下内容:

deflint(*,config="filename"):# do something here

因为它将提供相同的功能 因为需要装饰。不管你怎样 真想强制使用关键字 参数,可以使用requires 装饰工。

需要

声明函数将需要 调用时一个或多个关键字参数 不管他们是否被抓获。这是 kwonlydecorator的强制变体。 例如:

classCombineTrait(Trait):combine=Method("combine")@accepts(CombineTrait)@requires("x","y")defcombine(x,y):returnx.combine(y)

另一个捕获的变量变量 decorator是kwonlydecorator。它 如果你想的话 设置默认变量,但仅检查捕获的 一个。

抛出

声明函数只能抛出 指定的异常,例如:

@accepts(float,float)@throws(ZeroDivisionError)defdivide(x,y):returnx/y

这有利于调试或开发 当你想确保 函数抛出给定的异常。

单一分派方法

在python 3中,functools库 包括singledispatch方法, 它接受一个argspec然后 可调用的,不同的 根据他们的类型调用。利用那个 可以构建PEP443样式 通用调度函数。为了 示例:

frompromises.trait.specimportNumberfromfunctoolsimportsingledispatch@singledispatchdefmethod(x):pass@method.register(float)@method.register(int)def_(x):returnx*2

记住一次派遣 通用函数确实要付出代价, 尤其是在 运行时,除非使用类似jit的 皮比。而且,它们不与 从promises开始 函数不使用isinstance 作为类型检查的一种方式。

如果你在派遣时需要特质 可以使用以下函数 图案:

frompromises.trait.specimportNumberfrompromises.dispatchimportsingledispatch@singledispatch("x")deff(x,y):pass@f.register(Number)def_(x,y):returnx+y@f.register(str)def_(x,y):returnstr(x)+y

语义几乎与 标准图书馆调度功能 除了它可以发送 根据给定的论点而不是 第一个论点,减少需求 用于arg交换帮助函数。

运行测试

您还可以运行 当前版本的承诺 通过运行下面的命令库:

$ git clone ssh://git@github.com/eugene-eeo/promises
$ python promises/tests.py

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
从文本文件中读取时显示java符号“ï»”   java在有很多生产商的情况下如何改进Disruptor?   不同线程的java不同堆栈   用Java模拟oraclespool   jsp java访问自定义web中的错误信息。xml错误页   给出奇怪结果的java集成堆栈   java在jsp中显示值列表   java会话。保存更新具有错误ID的实体   在树数据结构中添加节点时的java递归   java在Spring Data Mongodb中使用$$ROOT检索整个文档   java我应该把图像放在罐子里还是不放在罐子里?(Inno设置)   java将bat文件放入jar文件中   Java:如何在节点上执行XPath查询   控制台应用程序如何在Mac上从Java输出重音字符?