放松型

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将spring j_spring_安全检查迁移到登录   log4j2中自定义appender中AppConfig的java问题   在将java转换为Json时是否可以忽略内部类名和变量   用java将PDF文件转换为十六进制格式   java将值从AsyncTask返回到主类   java如何导入带有部署变量类名的静态函数?   java Spring Boot@ConfigurationProperties未从环境检索属性   java为什么API调用需要80毫秒的延迟才能到达控制器(在Google应用程序引擎中)?   XML配置中MarshallingMessageConverter中的java设置MarshallTo获取无效属性“MarshallTo”   java从群中获取facebook帖子   @ComponentScan的java excludeFilters不起作用   java将单选按钮值从一个类传递到另一个类   java使JTextArea在Swing中可滚动   java Android增强现实应用程序:将球坐标旋转到设备坐标系