1

我正在寻找任何PEP 3124实施或开发过程。我对邮件列表不是很熟悉,但是去年Python邮件列表中似乎没有出现序列“3124”。是否有关于此 PEP 的一些信息?

4

2 回答 2

3

本 PEP 中描述的大部分功能已经在 PEAK-Rules 框架的开发版本中实现。特别是,那里已经存在基本的重载和方法组合框架(减去 @overload 装饰器)。在撰写本文时,peak.rules.core 中所有这些功能的实现是 656 行 Python。

http://www.python.org/dev/peps/pep-3124/#implementation-notes

于 2010-08-15T21:13:52.323 回答
0

我只是在阅读 PEP 3124 并且对自己说,“这听起来并不难实现”,并在阅读这个 SO 问题之前制定了一个解决方案。所以在这里(没有任何错误检查)。

def overload(f):
    oldfunc = globals()[f.__name__]
    param1 = f.__code__.co_varnames[0]
    type1 = f.__annotations__[param1]
    def impl(*args, **kwargs):
        if param1 in kwargs:
            arg1 = kwargs[param1]
        else:
            arg1 = args[0]
        if isinstance(arg1, type1):
            return f(*args, **kwargs)
        else:
            return oldfunc(*args, **kwargs)
    impl.__name__ = f.__name__
    return impl

from math import sin
import numpy

@overload
def sin(x: numpy.ndarray):
    return numpy.sin(x)

sin(3.14)
# 0.0015926529164868282

sin(numpy.arange(10))
# array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
#        -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])
于 2019-10-16T23:06:03.163 回答