放松型

relaxed_types的Python项目详细描述


这个库提供了一个dsl来在python中执行类型检查。提供以下内容:

  • typed_return:用于验证返回值类型的decorator
  • check_type:检查值是否与类型和谓词规范匹配
  • Any:与check_typetyped_returned一起使用的任何python对象匹配的sentinel对象
  • Values:与指定值而不是规范匹配的谓词函数
  • Or:执行的谓词函数确保其中一个规范匹配
  • And:执行的谓词函数确保所有规范匹配
  • ReturnTypeError:如果类型检查失败,check_type引发的异常

这个库的主要目标是有一个简单的方法来确保通过typed_return动态返回类型。

键入_return

列表

下面的代码片段演示如何执行类型检查(整数列表):

>>>@typed_return([int])...deffunc(v):...returnv+[3,4]...>>>func([1,2])[1,2,3,4]>>>func([1,2.0])Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor2.0,expected<type'int'>.Outervalue:[1,2.0,3,4]

元组

与列表不同,元组的大小是固定的。元组规范长度必须与值长度匹配。

>>>@typed_return((str,int))...deffunc(v):...returnv...>>>func(('hello',123))('hello',123)>>>func(('hello','world'))Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor'world',expected<type'int'>.Outervalue:('hello','world')

设置

集合的行为与列表相同:

>>>@typed_return({str})...deffunc(x):...returnx.union({"test"})...>>>func({"a","b"})set(['a','test','b'])>>>func({"a","b",1,2,3})Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor1,expected<type'str'>.Outervalue:set(['a',1,2,3,'test','b'])

词典

可以为字典键值指定所需的类型。指定的所有键必须存在于字典中,值{TT3}$可以指定为一个键,以便验证其他键。

>>>@typed_return({"name":str,"age":int})...deffunc(v):...v['test']='test'...returnv...>>>func({"name":"John Doe","age":21}){'test':'test','age':21,'name':'John Doe'}>>>func({"name":"Guy","age":"47"})Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor'47',expected<type'int'>.Outervalue:{'test':'test','age':'47','name':'Guy'}

下面的示例演示如何将键name指定为str,将任何其他键指定为int

>>>fromrelaxed_typesimport*>>>@typed_return({"name":str,Any:int})...deffunc(x):...returnx...>>>func({"name":"John Doe","b":2,"c":3}){"name":"John Doe","b":2,"c":3}

谓词

谓词允许您创建自定义类型检查。 谓词是一个需要对象并返回布尔值的函数:True表示传入的对象与期望值匹配,False表示不匹配。

下面的代码片段确保func只返回奇数:

>>>defodd(x):...returnx%2!=0...>>>@typed_return(odd)...deffunc(v):...returnv*3...>>>func(1)3>>>func(2)Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor6,expected<functionoddat...>.Outervalue:6

由于谓词支持,您可以将relaxed_types与其他库集成,例如voluptuous

>>>fromvoluptuousimportLength>>>@typed_return([int],Length(min=10,max=100))...deffunc(l):...returnl*2...>>>func(range(10))[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]>>>func(range(3))Traceback(mostrecentcalllast):...voluptuous.LengthInvalid:lengthofvaluemustbeatleast10

此集成的唯一问题是它可能会引发ReturnTypeError或 从voluptuous.errors.Invalid继承的异常。

与指定值匹配的谓词函数(不是规范)。这对于测试文本很有用:

>>>func(0)0>>>func(1)1>>>func(2)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"relaxed_types/__init__.py",line16,innewfncheck_type(result,expected_type,outer_value=result,extra=extra)File"relaxed_types/checks.py",line22,incheck_type_check_predicate(value,expected_type,outer_value)File"relaxed_types/checks.py",line35,in_check_predicate_fail(value,expected_type,outer_value,msg=expected_type.__doc__)File"relaxed_types/checks.py",line85,in_failraiseReturnTypeError(msg,value)relaxed_types.exceptions.ReturnTypeError:Expected"2"tobein(0,1)

至少匹配一个规范的谓词函数:

>>>@typed_return(Or(int,float))...deffunc(x):...returnx...>>>func(1)1>>>func(1.0)1.0>>>func("1")Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"relaxed_types/__init__.py",line16,innewfncheck_type(result,expected_type,outer_value=result,extra=extra)File"relaxed_types/checks.py",line22,incheck_type_check_predicate(value,expected_type,outer_value)File"relaxed_types/checks.py",line35,in_check_predicate_fail(value,expected_type,outer_value,msg=expected_type.__doc__)File"relaxed_types/checks.py",line85,in_failraiseReturnTypeError(msg,value)relaxed_types.exceptions.ReturnTypeError:'1'didnotmatchOr(<type'int'>,<type'float'>).Moredetailsaboutthelastcheck:Typemismatchfor'1',expected<type'float'>.Outervalue:'1'

以及

与所有规范匹配的谓词函数:

>>>fromrelaxed_typesimport*>>>@typed_return({"i":And(int,lambdax:x>0)})...deffunc(x):...return{"i":x}...>>>func(1){'i':1}>>>func(1.0)Traceback(mostrecentcalllast):...relaxed_types.exceptions.ReturnTypeError:1.0didnotmatchAnd(<type'int'>,<function<lambda>at0x105f7a848>).Moredetailsaboutthelastcheck:Typemismatchfor1.0,expected<type'int'>.Outervalue:1.0>>>func(-1)Traceback(mostrecentcalllast):...relaxed_types.exceptions.ReturnTypeError:-1didnotmatchAnd(<type'int'>,<function<lambda>at0x105f7a848>).Moredetailsaboutthelastcheck:Typemismatchfor-1,expected<function<lambda>at0x105f7a848>.Outervalue:-1

组合在一起

可以组合列表、元组、字典、谓词和任何python类型。

>>>@typed_return(int,lambdax:x>0)...deffunc1(x):...returnx+10...>>>>>>func1(10)20>>>func1(-100)Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor-90,expected<type'int'>.Outervalue:-90>>>@typed_return([int],lambdax:len(x)>0)...deffunc1(x):...returnx...>>>>>>func1([1,2])[1,2]>>>func1([])Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor[],expected[<type'int'>].Outervalue:[]>>>@typed_return([{"name":lambdax:x.upper()==x}])...deffunc2(x):...returnx...>>>>>>func2([{"name":"JOHN DOE"}])[{'name':'JOHN DOE'}]>>>func2([{"name":"test"}])Traceback(mostrecentcalllast):...relaxed_types.ReturnTypeError:Typemismatchfor'test',expected<function<lambda>at0x10e325758>.Outervalue:[{'name':'test'}]>>>@typed_return([{"data":Any,"id":And(int,lambdax:x>0)}])...deffunc3(x):...returnx...>>>func3([{"data":"price=10","id":1}])[{'data':'price=10','id':1}]>>>func3([{"data":10,"id":2}])[{'data':10,'id':2}]>>>func3([{"data":{"price":10},"id":2}])[{'data':{'price':10},'id':2}]

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

推荐PyPI第三方库


热门话题
java应该考虑使用DTO来代替Spring控制器层吗?   java为什么要将Maven与Git结合起来?   java试图将CSV转换为XLSX,但使用了错误的逗号拆分列   mysql Spring 3+Hibernate:java。sql。BatchUpdateException:无法添加或更新子行(ManyToMany)   java基本字符串反转器   java无法使用RestControllerAdvice为身份验证失败生成自定义错误消息   java当只允许SQLException时,如何抛出EOFEException?   java如何创建播放模块?   Android中匿名类的java实例化异常问题   java两个停靠组件,其中第二个组件填充剩余空间   java如何在按钮延迟时启用它   Java中正在运行的应用程序中的后台进程   java我正试图从一个字符串打印出这个字符输出   如何使用java socket通过两个不同的wifi连接两台电脑?   javaapachecamel:如何将分层数据从数据库转换为pojo   java Webrtc:OniconConnectionChange和onConnectionChange之间有什么区别   java如何重写已经创建的JTable方法   爪哇扫雷机堆垛机   雅加达ee Java ee EJB 3.0 Glassfish