如何在Python或函数式编程语言中创建函数扩展/函数接口/函数类?

时间:2015-02-15 17:01:18

标签: python types lambda functional-programming lambda-calculus

想要定义一些我最好打电话'功能扩展' /'功能界面'或者'功能类别'在Python中。 Haven在其他语言中看不到类似的结构,但我不是像LISP这样的函数式语言专家。如果这更容易做,请考虑稍后更改为其他语言,例如朱莉娅。

'功能扩展'将表达一个函数的几个参数的结合是一种正式的方式,我们最终得到一个属于特定类函数的函数'。在下面的示例中,具体的功能类别为'是一个数据转换函数(如transform_data_func_class),它有一个唯一的参数:datapower_data扩展transform_data_func_class作为绑定exponent参数,我们最终得到一个属于'类功能的函数&#39}。 transform_data_func_class

A'功能类别'定义签名的一部分,如:

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.')

但是在致电TypeError: object() takes no parameters时我得到TransformDataFuncClass(data=1)。信令功能扩展'通过阶级继承将是一个很好的方式。

我最精心策划的计划是:

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)是自然有效的通话。虽然后者实际上有点复杂,并且无法并行计算,因为我从dillpickle的更聪明的替代方案)中得到错误<class PowerData>: it's not the same object as PowerData

任何建议都欢迎,真的。我也对理论上的考虑以及如何在其他语言中做到这一点感兴趣。

1 个答案:

答案 0 :(得分:3)

有点难以看到你想要完成的事情。具体来说,对于这两个函数定义:

def transform_data_interface(data):
    raise InterfaceError('Called unimplemented interface.')

def power_data(data, param1):  # extends: transform_data_interface
    return data ** param1      # apply the additional the parameter

power_data如何延伸transform_data_interface?他们没有相同的签名:&#34;界面&#34;采用单个参数,而实现接口的函数需要两个。这并不符合大多数人所说的interface

如果您尝试做的是强制某个给定函数具有与另一个函数相同的参数并返回值,则可以通过检查函数的参数来实现此目的。

对于chain功能,请参阅3。您可以修改其中一个也进行上面提到的那种检查。

至于其他更多功能语言如何做这种事情,我不确定。我看到我在上面链接的界面文章中提到Composing functions in python,看起来有一些很好的信息。

如果您有更多具体信息或背景信息,请更新您的帖子!