我想定义一些东西,最好在Python中调用“function extension”/“function interface”或“class of functions”。在其他语言中还没有见过类似的构造,但我不擅长LISP这样的函数式语言。考虑过以后换成其他语言,如果这更容易的话,比如朱莉娅。你知道吗
“函数扩展”将是一种形式化的方式来表示一个函数的几个参数,我们最终得到一个属于特定“函数类”的函数。在我下面的示例中,特定的“函数类”是一个数据转换函数(如transform_data_func_class
),它只有一个参数:data
。power_data
扩展transform_data_func_class
作为绑定exponent
参数,我们最终得到一个属于“函数类”transform_data_func_class
的函数。你知道吗
“函数类”定义了签名的一部分,如:
def transform_data_func_class(data):
raise InterfaceError('Called unimplemented function class.')
然后定义扩展“函数类”的函数:
def power_data(data, exponent): # extends: transform_data_func_class
return data ** exponent # apply the additional the parameter
因此,在绑定附加参数时,我们得到的签名与扩展的“函数类”的签名匹配:
square = partial(power_data, exponent=2) # matches signature transform_data_func_class(data)
例如,为了将函数类型指定为其他函数的输入和输出,我将使用这些函数:
def chain(data, transform_data_func_class_list):
"""Passing in data and a list of functions being elements of
transform_data_func_class with a sole argument: data."""
...
奇怪的是,在一般对象的情况下,定义类/类型相对容易,而在函数的情况下,却没有这样明显的构造。目前,我使用extends: function_class
注释来指定函数类型/类—这是从mypy
借用的想法—理想情况下会使用更正式的东西。你知道吗
欢迎任何建议,如果我可以通过__call__
调用生成的构造就太好了。我想上这样的课:
class TransformDataFuncClass(object):
@classmethod
def exec(cls, data):
raise InterfaceError('Called unimplemented function class.')
但我不喜欢不常用的exec()调用。还想到:
class TransformDataFuncClass(object):
@classmethod
def __call__(cls, data):
raise InterfaceError('Called unimplemented function class.')
但是我在调用TransformDataFuncClass(data=1)
时得到了TypeError: object() takes no parameters
。不过,通过类继承发出“函数扩展”信号将是一种很好的方法。你知道吗
我最周密的计划是:
class FuncClass(object):
"""Takes care of function classes and extensions being
just callable through __call__, e.g. PowerData(data=1, power=2)
instead of instantiating first: PowerData()(data=1, power=2)"""
def __init__(self, wrapped_class):
self.wrapped_class = wrapped_class
self.wrapped_instance = wrapped_class()
def __call__(self, *args, **kwargs):
return self.wrapped_instance(*args, **kwargs)
@FuncClass
class TransformDataFuncClass(object):
def __call__(self, data):
raise InterfaceError('Called unimplemented function class.')
@FuncClass
class PowerData(TransformDataFuncClass.wrapped_class):
def __call__(self, data, exponent):
return data ** exponent # apply the additional the parameter
所以TransformDataFuncClass(data=1)
和PowerData(data=1, exponent=2)
是自然有效的调用。虽然后者实际上工作起来有点复杂,而且不能并行化计算,因为我从dill
(一个比pickle
更聪明的替代方法)得到错误,说<class PowerData>: it's not the same object as PowerData
。你知道吗
任何建议都欢迎,真的。我还对理论上的考虑以及如何在其他语言中实现这一点感兴趣。你知道吗
很难看出你想要完成什么。具体来说,对于这两个函数定义:
power_data
如何扩展transform_data_interface
?它们没有相同的签名:“接口”使用一个参数,而实现接口的函数使用两个参数。这与大多数人所说的interface不符。你知道吗如果您要做的是强制一个给定函数与另一个函数具有相同的参数和返回值,那么您可以通过检查函数的参数来实现这一点。你知道吗
"# extends:"
注释执行的操作有关
chain
函数,请参见Composing functions in python。您可以修改其中的一个来执行我上面提到的那种检查。你知道吗至于其他功能性更强的语言是如何做到这一点的,我不确定。我看到我在上面链接的那篇接口文章中提到的type classes,看起来那里有一些很好的信息。你知道吗
如果你有更多的细节或背景,请更新你的文章!你知道吗
相关问题 更多 >
编程相关推荐