python类型检查
Promises的Python项目详细描述
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