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