【发布时间】:2010-11-27 09:56:52
【问题描述】:
假设我有一个通用函数f。我想以编程方式创建一个函数 f2,其行为与 f 相同,但具有自定义签名。
更多细节
给定一个列表l 和字典d 我希望能够:
- 将
f2的非关键字参数设置为l中的字符串 - 将
f2的关键字参数设置为d中的键,并将默认值设置为d的值
即。假设我们有
l = ["x", "y"]
d = {"opt": None}
def f(*args, **kwargs):
# My code
然后我想要一个带有签名的函数:
def f2(x, y, opt=None):
# My code
特定用例
这只是我的特定用例的简化版本。我只是举个例子。
我的实际用例(简化)如下。我们有一个通用的启动函数:
def generic_init(self, *args, **kwargs):
"""Function to initiate a generic object"""
for name, arg in zip(self.__init_args__, args):
setattr(self, name, arg)
for name, default in self.__init_kw_args__.items():
if name in kwargs:
setattr(self, name, kwargs[name])
else:
setattr(self, name, default)
我们想在多个类中使用这个函数。特别是,我们想创建一个函数__init__,其行为类似于generic_init,但在创建时具有由某些类变量定义的签名:
class my_class:
__init_args__ = ["x", "y"]
__kw_init_args__ = {"my_opt": None}
__init__ = create_initiation_function(my_class, generic_init)
setattr(myclass, "__init__", __init__)
我们希望 create_initiation_function 使用__init_args__ 和__kw_init_args__ 定义的签名创建一个新函数。可以写create_initiation_function吗?
请注意:
- 如果我只是想改进帮助,我可以设置
__doc__。 - 我们想在创建时设置函数签名。之后就不需要更改了。
- 我们可以创建一个具有所需签名的新函数,而不是创建像
generic_init这样的函数,而是使用不同的签名来调用generic_init - 我们要定义
create_initiation_function。我们不想手动指定新函数!
相关
- Preserving signatures of decorated functions:这是装饰函数时如何保留签名。我们需要能够将签名设置为任意值
【问题讨论】:
-
您是在问如何以编程方式创建这样的功能吗?无论如何,我认为你需要给我们一些背景信息。你想如何使用它?你想如何指定函数的主体?你能告诉我们你想如何使用它吗?
-
我重新编辑后是否更清楚了?
-
@Casebash:我认为这是一个非常简洁的功能。您有一个泛型函数,并且想要创建几个具有特定签名的非泛型函数。最简洁的方法就是创建它们。
-
@Casebash 你为此受到了很多嘲笑,但我发现这是一个合理的想法。不可行,但这个想法很酷。
-
所有批评这个问题的人都需要立即去研究
namedtuple。它完全完成了 OP 请求有关如何完成的信息的任务(以编程方式创建函数签名)。