【问题标题】:Python decorate function preserving part of signaturePython装饰函数保留部分签名
【发布时间】:2021-01-02 21:38:31
【问题描述】:

我写了以下装饰器:

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

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

@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 模块,但我只需要保留原始签名的部分,我不知道这是否可能。

【问题讨论】:

  • 我可能会在这里偏离基础,但是如果您需要使用某些参数进行初始化,然后在传递进一步更改的参数时反复引用它们......这听起来像是你在重新发明一个东西。将其实现为一个简单的类可能会更简洁,也许作为@dataclass 来简化初始值设置。
  • 问题是我有几个 my_fn 形式的函数,我无法触及,我必须编写一个包装模块来展示具有我所描述的那种签名的函数返回“部分化”的版本。我当然可以为每个使用正确的签名手动编写一个包装器,逐个案例:wrapped_my_fn(fix1, fix2) 返回一个接受 dyn1 和 dyn2 计算结果的函数,但这将是乏味和不雅的。
  • 所以您希望以某种方式自动/以编程方式区分哪些参数是固定的,哪些是动态的?它遵循某种模式吗?
  • 您的问题让我意识到,如果 dyn 和 fix 都是可变长度,则会出现这个额外的问题。为了一般性,我写了它。但实际上动态论证总是一个,第一个。我要编辑问题。
  • 如果没有有意义的名称或清晰的示例,很难说出实际需求是什么,但不妨看看 functools.partialmemoization?他们“预设”或“缓存”一些参数和结果。

标签: python python-decorators


【解决方案1】:

https://stackoverflow.com/a/33112180/9204395 汲取灵感,可以通过手动更改arg_partializer 的签名来完成此操作,因为在相关范围内只有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

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

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2017-07-10
    • 2020-11-02
    • 2019-03-11
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多