用于调试和开发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类:
…不变…
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类:
…不变…