函数助手
模块: 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) – 要扩展的可调用对象。