用于重载python函数的库

Dispatching的Python项目详细描述


用于在类型和签名上重载函数的python库。

概述

当然,*args**kwargs都很棒。但有时你需要更多- 您需要根据类型或 你论点的布局。dispatching允许您这样做。由 将类型注释附加到函数,并用 dispatch,您可以拥有一组函数并自动 确定正确的电话号码。不再有elif isinstance链, 或len(args),或arg in kwargs

用法

要使用分派,请创建一个DispatchGroup对象。这个对象 收集在执行 调度电话。

importdispatchinggreetings=dispatching.DispatchGroup()

要向调度组添加函数,请用 dispatch成员。

@greetings.dispatchdefgreet(x:int):print("Hello, int!")@greetings.dispatchdefgreet(x:str):print("Hello, str!")greet(1)# Prints "Hello, int!"greet('string')# Prints "Hello, str!"greet([1,2,3])# Raises DispatchError, a subclass of TypeError

参数注释决定调用什么函数。每个 注册到组的函数将尝试使用参数 绑定到其参数签名。第一个匹配的被调用。 如果不匹配,将引发Dispatcherror。

不是每个参数都需要注释。完全使用 创建基本案例的未注释函数,如果 没有其他匹配项:

@greetings.dispatchdefgreet(x):print("Hello, mysterious stranger!")greet([1,2,3])# Prints "Hello, mysterious stranger!"greet(1)# Still prints "Hello, int!"

不过,要小心。函数的尝试顺序是 修饰,因此在基本情况之后添加额外的重载不会产生任何效果 好:

@greetings.dispatchdefgreet(x:list):print("Hello, list!")greet([1,2,3])# still prints "Hello, mysterious stranger"

为了解决这个问题,您可以使用dispatch_first decorator,它 将函数添加到要尝试的函数列表的前面:

@greetings.dispatch_firstdefgreet(x:list):print("Hello, list!")greet([1,2,3])# now prints "Hello, list!"

其他使用说明

不必显式创建DispatchGroup对象。 相反,您可以使用全局函数dispatch来创建新的 DispatchGroup隐式地。修饰后的函数将自动 将dispatchdispatch_first属性附加到 这样就可以添加更多的重载。

@dispatching.dispatchdefhalf(x:int):returnx/2@half.dispatchdefhalf(x:str):returnx[0:len(x)/2]

这也适用于使用显式DispatchGroup时。因为 一切事物都有它的属性,也不必 为所有函数指定相同的名称,或为它们指定不同的名称 DispatchGroup

除了按类型匹配之外,还可以按参数数进行匹配:

@dispatching.dispatchdefnargs(a):return1@nargs.dispatchdefnargs(a,b):return2@nargs.dispatchdefnargs(a,b,c):return3assertnargs(1)==1assertnargs(5,4,3)==3assertnargs(2,4)==2#Using less than 1 or more than 3 will raise a DispatchError

或按谓词:

defis_odd(x):returnx%2==1defis_even(x):returnx%2==0@dispatching.dispatchdefevens_only(x:is_even):returnx@evens_only.dispatchdefevens_only(x:is_odd)raiseValueError(x)

或按值比较:

#Classic freshman recursion@dispatching.dispatchdeffib(n:0):return1@fib.dispatchdeffib(n:1)return1@fib.dispatchdeffib(n):returnfib(n-1)+fib(n-2)

示例

使自动装饰器的参数数过载:

fromdispatchingimportdispatch#Non-decorator version@dispatchdefadd_return_value(func,additional):defwrapper(*args,**kwargs):returnfunc(*args,**kwargs)+additionalreturnwrapper#decorator version.@add_return_value.dispatchdefadd_return_value(additional):defdecorator(func):returnadd_return_value(func,additional)returndecoratorplus_one_len=add_return_value(len,1)assertplus_one_len([1,2,3])==4@add_return_value(10)defdouble_add_10(x):returnx*2assertdouble_add_10(5)==20

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

推荐PyPI第三方库


热门话题
添加组件后,java JTable为空   java将json发送到php并插入mysql,但返回null   java Spring引导JNDI CommonJ资源   从不同PC创建和合并后的Java servlet问题   java如何在使用findelements时从xpath获取文本   java使用spring boot使用gmail smtp发送电子邮件   java在不使用pojo、bean或getter和setter的情况下获取Json标题的Json数组   Java中的OpenFile对话框将null作为响应   JavaBuilder模式。扩展接口   java中无需替换的数据结构选取   java如何评价Encog中的预测神经网络   java如何在安卓中使用实际的HttpURLConnection进行单元测试?   java使用XML配置禁用WebSocket中的CSRF保护   java如何通过hibernate从多表查询中获取数据?   mysql如何在java中获取更新的行Id   java AEM/CQ组件单一组件/有限组件   java FFmpeg Javacv延迟问题   显示整数数组的java不起作用