跳转到主要内容

通过@overload装饰器简单地进行方法和方法的重载

项目描述

通过@overload装饰器简单地进行方法和方法的重载。

此模块允许为函数、方法、类方法、静态方法或类提供多个接口。有关重载类的注意事项,请参阅以下内容。

根据调用参数模式选择合适的实现。

例如

>>> class A(object):
...   @overload
...   def method(self, a):
...     return 'a'
...   @method.add
...   def method(self, a, b):
...     return 'a, b'
...
>>> a = A()
>>> a.method(1)
'a'
>>> a.method(1, 2)
'a, b'

重载处理固定、关键字、变量(*args)和任意关键字(**keywords)参数。

它还处理注释,如果这些注释是类型的话

>>> @overload
... def func(a:int):
...   return 'int'
...
>>> @func.add
... def func(a:str):
...   return 'str'
...
>>> func(1)
'int'
>>> func('s')
'str'
>>> func(1.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "overload.py", line 94, in f
    raise TypeError('invalid call argument(s)')
TypeError: invalid call argument(s)

此功能(以及目前该模块)需要Python 3。

结果可调用对象的文档字符串和名称(即文档)将与第一个重载的可调用对象的相匹配。

重载类

重载类允许您根据每个替代类型的__new__方法的构造参数选择类类型。

但是,有一个限制:__new__方法必须显式调用基类的__new__方法,而不是像通常那样使用super()。这是因为经过@overload处理后,该类是一个函数,而super()不喜欢传入函数。所以,而不是

@overload
class A(object):
    def __new__(cls):
        # this will fail because "A" is a function now
        return super(A, cls).__new__(cls)

您必须

@overload
class A(object):
    def __new__(cls):
        # must explicitly reference the base class
        return object.__new__(cls)

我将留给读者去解释他们使用@重载类的原因。

版本历史(简要)

  • 1.1 更改了无效调用TypeError的文本。删除了调试打印。

  • 1.0 初次发布

请查看源文件末尾的使用许可。


我想知道这个模块是否有用 - 如果您使用它,请在此https://www.ohloh.net/p/pyoverload处表明

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

overload-1.1.tar.gz (4.6 kB 查看哈希值)

上传时间 源代码

支持