函数助手

模块: polygraphy.func

extend(extend_func)[source]

一个装饰器,使用它装饰的函数来扩展作为参数提供的函数。

这最好用一个例子来说明

def x(a0, a1, a2):
    rv0 = [a0, a1, a2]
    rv1 = None
    return rv0, rv1

@extend(x)
def y(rv0, rv1):
    rv0.append(-1)

# We can now call `y` as if it were `x`, and we will receive
# the return values from `x` after any modifications by `y`
rv0, rv1 = y(1, 2, 3)
assert rv0 == [1, 2, 3, -1]
assert rv1 is None

在这种情况下,extend 本质上是以下语法的语法糖

def y(a0, a1, a2):
    rv0, rv1 = x(a0, a1, a2)

    # Body of `y` from previous section
    rv0.append(-1)

    return rv0, rv1

如果 y 没有返回任何内容,或者返回 None,那么 extend 将确保 x 的返回值被转发给调用者。这意味着 y 将提供与 x 完全相同的接口。

如果 y 返回了除 None 之外的其他内容,那么它的返回值将提供给调用者,并且 x 的返回值将被丢弃。

在某些情况下,可能需要访问 x 的参数。如果 y 在其常用参数(即 x 的返回值)之前接受 x 的所有参数,则传递给 x 的所有参数都将转发给 y。 请注意,如果 x 就地修改其参数,则 y 将看到修改后的参数,而不是 原始参数。 例如

def x(x_arg):
    return x_arg + 1

def y(x_arg, x_ret):
    # `y` can now see both the input argument as well as the return value of `x`
    assert x_ret == x_arg + 1

assert y(5) == 6

注意:此函数将自动解包被扩展函数返回的元组。因此,以下 x 的实现方式与上面提到的方式类似

def x(a0, a1, a2):
    ret = (rv0, rv1)
    return ret # Tuple will be unpacked, and `y` still sees 2 parameters

注意:被装饰的函数不得使用可变参数,如 *args**kwargs

参数:

extend_func (Callable) – 要扩展的可调用对象。