用于调试和开发python代码的类型检查工具

pycheck的Python项目详细描述


checked(f)
checked是一个函数修饰符,它使用函数注释作为类型声明
,并验证函数是否已传递并返回正确的值类型。

是的,是的,我知道,这是python,我们不需要进行类型检查。在你愤怒地敲击键盘告诉我我是个多么的白痴之前,请至少阅读下面的"动机"部分。谢谢。

示例用法:
----

@checked
def function(参数:<;type declaration>;)->;<;type declaration>;



"function"可能是函数操作、方法或生成器*。

*对于生成器,实际返回类型为<;generator>;但是
@选中将检查生成器生成的值是否为指定类型的值。

<;type declaration>;可以是任何下列对象之一:

*类或类型对象(int、str、myClass等)

示例:
``def(x:int):f()只接受int``

*类型对象的元组(或任何iteable),表示该值可以是其中任何类型的
的实例。


(通常用于声明函数不返回值)

d值none,表示
该值可以是任何指定类型或特殊值none。

示例:
``def f(x)->;(str,none)f()必须返回str或none`

*dict(或ot她的映射类型)对象,它将集合类型映射到元素类型,
{<;集合类型>;:<;元素类型>;}。

此用法意味着函数将生成类型为<;集合类型>;
(例如set,l它只包含类型为<;element type>;

的元素示例:
``def f(x)->;{set:int}:f()必须返回一组整数``

*可调用的对象,它接受一个参数并返回是真是假。可调用的
对象在注释函数参数时被视为前置条件,在注释返回值时被视为
后置条件。传递或返回的值将
传递给可调用函数,如果结果不为真,则会引发错误。

示例
``def(x:lambda x:x>;0):f()仅接受大于零的值``

``def g(x)->;lambda y:y>;=0:g()必须返回值>;=0`


默认值、*arg和**kwd
--------
具有默认值的参数以及*arg和**kwd参数也可以声明其类型:

@checked
def函数(x:<;type declaration,y:<;type declaration>;=1,*参数:<;type declaration>;,**kwds:<;type declaration):



de错误模式:checked将在开发和测试期间用作工具,以帮助更快地识别错误。对于
,此原因`@checked``仅在调试模式下才起作用
(即当``uu debug==true``)。如果不是在调试模式下,则将其定义为,


def checked(f):
return f



动机:
——
Ben Nadel的白皮书《目标健美操》(http://www.ben nadel.com/resources/uploads/2012/objectcalistonics.pdf)中概述的ercises。

Nadel的练习之一是"包装所有原语和字符串"。他的意思是,与其向函数传递简单的
int、float和string,不如创建int、float和str的简单子类来表示参数例如,eter实际上表示并保护您不会意外地将一个
表示小时的整数传递给一个用于处理美元弹药的函数。当然,Nadel用Java编写了他的论文,所以Java编译器实际上会遇到这样的错误。
在尝试将该建议应用于python时,为了实现类型检查,需要一些东西。
在对互联网进行了5分钟的详尽搜索后,我决定尝试自己实现自己的软件包(好吧,我真的很想看看我是否能做到)。



*当前无法验证为参数指定的默认值是否与该参数的
类型声明冲突。
示例:
def f(x:int="bad default value"):



希望前面的类型声明足够让您使用正确的类型。

这实际上至少有一个合法的用法,实际上,在默认值
是一个魔术值(通常为none)的情况下,表示用户没有提供值:

def f(x:in t=none)
用户从未打算指定值none。用户需要
提供一个int值或根本不提供值。

对单个参数或返回值进行操作。验证无法计算所有参数,例如,您不能编写检查参数是否从最小到最大排序的
前置条件。



实际上,包含错误类型的
元素的容器的错误消息文本不清楚


命名空间,不能是。

两个典型的原因是,

1。在同一类的方法的注释中使用类。
示例:
类a:
@选中
@class method
def factory(cls,…)->;错误,在处理注释时,a尚未定义

解决方案:
a类:
@选中
@classmethod
def factory(cls,…)->;type_proxy('a')有效


2.试图创建一个引用尚未定义的类的注释,该类本身使用一个引用回该类的注释(即循环引用)。因为这两个类相互引用,所以解决方案并不简单,只需在第一个类之前移动第二个类定义即可。

#错误:b尚未定义
返回b(self)

b类:
@选中
def to_a(self)->;a:a指b,b指a,因此不重要
return a(self)首先定义哪个类,将出现错误。

lf)

B类:
…不变…

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

推荐PyPI第三方库


热门话题
java用<a4j:repeat>迭代<rich:datatable>的内容不会显示任何JSF内容   Hibernate中的java级联类型保存更新   java小程序将文本对齐到中下方   Java中的并发无锁并发链表   java Amazon CloudWatch API未返回   如何在Linux中使用多个外部Jar文件运行Java程序[错误:无法找到或加载主类]   Java通过单击小程序上的某个位置来移动绘制的图像?   AlertDialog上背景模糊的java问题   javaakka:如何为参与者分配别名路径   C++ java。lang.IllegalArgumentException:函数的参数0处不支持参数   java Eclipse自动填充类正在移动代码   Office Web应用程序集成到Java应用程序中   java无法更新运行4的智能手机上PreferenceActivity的标题摘要。十、   java操纵杆死区计算   java使用TextWatcher更新ListView中的EditText   线程错误Memcached cloud Heroku Java   java将JSON消息转换为javax。jms。ActiveMq中的ObjectMessage   Java:如何从类型A转换为类型B?