繁体   English   中英

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

[英]How to create function extensions / function interfaces / classes of functions in Python or functional programming languages?

我想定义一些最好在Python中称为“函数扩展” /“函数接口”或“函数类”的东西。 尚未见过其他语言的类似构造,但我不是LISP等功能语言的专家。 朱莉娅(Julia)说,如果以后更容易做到,请考虑改用其他语言。

“函数扩展”将是表达绑定一个函数的几个参数的正式方法,我们最终得到一个属于特定“函数类”的函数。 在下面的示例中,特定的“函数类”是数据转换函数(如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.')

但是我得到TypeError: object() takes no parameters调用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得到了错误,所以无法并行化计算( dill是一种更好的替代pickle ),并说<class PowerData>: it's not the same object as PowerData

真的有任何建议欢迎。 我也对理论上的考虑以及其他语言中的实现方式感兴趣。

很难看出您要完成什么。 具体来说,对于这两个函数定义:

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 它们没有相同的签名:“接口”采用一个参数,而实现接口的函数采用两个参数。 这与大多数人所说的接口不符。

如果要执行的是强制给定函数具有与另一个函数相同的参数并返回值,则可以通过检查该函数的参数来实现。

  • stdlib中的inspect模块可以告诉您函数采用什么参数,特别地, 签名为此提供了一个不错的API
  • 函数注释允许您标记函数的参数并返回值,这可以用"# extends:"注释代替您尝试执行的操作
  • 另请参阅有关使用函数注释进行可选键入mypy新建议
  • 一个修饰是添加这种检查的完美的地方,因为它包装的功能,它执行之前,很多人已经取得的类型检查装饰(例如: 123

有关chain函数,请参见在python中编写函数 您可以修改其中的一种,也可以进行上述的检查。

至于其他功能更多的语言如何执行这种操作,我不确定。 我看到上面链接到该接口文章中提到的类型类 ,看起来那里有一些不错的信息。

如果您对要执行的操作有更多详细信息或背景,请更新您的帖子!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM