Python装饰保留签名部分的函数

Python装饰保留签名部分的函数,python,python-decorators,Python,Python Decorators,我写了以下的decorator: 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 此装饰程序的目的

我写了以下的decorator:

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\u fn
显示了以下签名:
My\u fn(*可修复的参数)

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

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

从中汲取灵感,可以通过手动更改
arg\u 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

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

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