繁体   English   中英

Python 装饰 function 保留部分签名

[英]Python decorate function preserving part of signature

我写了以下装饰器:

def partializable(fn):
    def arg_partializer(*fixable_parameters):
        def partialized_fn(dynamic_arg):
            return fn(dynamic_arg, *fixable_parameters)

        return partialized_fn
    return arg_partializer

这个装饰器的目的是将 function 调用分成两个调用。 如果我装饰以下内容:

@partializable
def my_fn(dyn, fix1, fix2):
    return dyn + fix1 + fix2

然后我可以这样做:

core_accepting_dynamic_argument = my_fn(my_fix_1, my_fix_2)
final_result = core_accepting_dynamic_argument(my_dyn)

我的问题是现在装饰的my_fn具有以下签名: my_fn(*fixable_parameters)

我希望它是: my_fn(fix1, fix2)

我怎样才能做到这一点? 我可能必须使用wrapsdecorator模块,但我只需要保留原始签名的一部分,我不知道这是否可能。

https://stackoverflow.com/a/33112180/9204395中汲取灵感,可以通过手动更改arg_partializer的签名来完成此操作,因为在相关的 scope 中仅知道fn的签名并且可以使用inspect处理。

from inspect import signature

def partializable(fn):
    def arg_partializer(*fixable_parameters):
        def partialized_fn(dynamic_arg):
            return fn(dynamic_arg, *fixable_parameters)

        return partialized_fn

    # Override signature
    sig = signature(fn)
    sig = sig.replace(parameters=tuple(sig.parameters.values())[1:])
    arg_partializer.__signature__ = sig

    return arg_partializer

这不是特别优雅,但当我想到这个问题时,我开始怀疑这(或概念上的等价物)是实现这一特技的唯一可能方法。 随意反驳我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM