我目前有以下结构:
在类中,我需要使用两个特殊变量和任意数量的参数来处理几种类型的函数。要将这些方法包装在我应用的方法中,我首先扫描函数签名(非常可靠)并确定参数和变量是什么。
然后我用以下方式用lambda表达式将它们绑定回来。让func(x, *args)
成为我的函数,然后我将绑定
f = lambda x, t: func(x=x, **func_parameter)
如果我得到func(x, t, *args)
我绑定
f = lambda x, t: func(x=x, t=t, **func_parameter)
和类似的,如果我没有变量。
我必须将f(x,t)
形式的函数传递给该类中的方法。
我想使用functools.partial - 它是更加pythonic的方式,并且执行时的性能更好(函数f
可能被称为几百万次......) 。我遇到的问题是,如果我有一个独立于变量t
和x
之一的基函数,我不知道该怎么办,这就是我使用lambda函数的原因,他们只是映射另一个变量'blind'。它仍然是两个函数调用,而lambda和partial的定义需要相同的时间,部分执行速度要快得多。
在这种情况下,是否有人知道如何使用偏?性能在这里是一个问题。
编辑:过了一会儿。我发现使用元组参数的函数求值比使用关键字参数更快,所以这是一个加号。 然后,最后,作为一个用户,我只想从Python中进行一些猜测工作,即直接定义
def func(x):
return 2*x
代替
def func(x, a):
return a*x
并直接调用它。这样我就可以直接使用这个功能了。第二种情况是,如果我实现x
和t
都作为部分映射存在的情况。
这可能是妥协。
答案 0 :(得分:1)
您可以编写具有f(x,t)
呼叫签名的适配器类。结果类似于functools.partial但更灵活。 __call__
为您提供一致的呼叫签名,并允许您添加,删除和映射参数。在创建实例时可以修复参数。它似乎应该像普通函数一样快地执行,但我没有基础。
玩具版:
class Adapt:
'''return a function with call signature f(x,t)'''
def __init__(self, func, **kwargs):
self.func = func
self.kwargs = kwargs
def __call__(self, x, t):
# mapping magic goes here
return self.func(x, t, **self.kwargs)
#return self.func(a=x, b=t, **self.kwargs)
def f(a, b, c):
print(a, b, c)
用法:
>>> f_xt = Adapt(f, c = 4)
>>> f_xt(3, 4)
3 4 4
>>>
不知道如何为任意参数和映射制作通用名称,也许某人会想出一个想法或编辑。
因此,如果您最终编写特定于每个函数的适配器,则该函数可以在类中嵌入而不是实例参数。
class AdaptF:
'''return a function with call signature f(x,t)'''
def __init__(self, **kwargs):
self.kwargs = kwargs
def __call__(self, x, t):
'''does stuff with x and t'''
# mapping magic goes here
return self.func(a=x, b=t, **self.kwargs)
def func(self, a, b, c):
print(a, b, c)
>>> f_xt = AdaptF(c = 4)
>>> f_xt(x = 3, t = 4)
3 4 4
>>>
我只是从我读过的东西中得到了这个,所以我不知道它是否可行。我觉得我应该赞扬我读到的来源,但对于我的生活,我无法找到它 - 我可能在pyvideo上看到它。