当前位置: 首页 > 知识库问答 >
问题:

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

诸彬郁
2023-03-14

我想定义一些东西,最好在Python中调用“函数扩展”/“函数接口”或“函数类”。我还没有在其他语言中见过类似的构造,但我不擅长LISP之类的函数式语言。如果这更容易做到,考虑以后改用其他语言,比如Julia。

“函数扩展”将是一种形式化的方式来表示绑定函数的几个参数,我们最终得到一个属于特定“函数类”的函数。在我下面的示例中,特定的“函数类”是一个数据转换函数(如transform\u data\u func\u class),它只有一个参数:datapower\u data扩展了transform\u data\u func\u类作为绑定指数参数,我们最终得到了一个属于“函数类”的函数transform\u data\u func\u类

类函数定义了签名的一部分,如:

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."""
    ...

奇怪的是,在一般对象的情况下,定义类/类型相对容易,而在函数的情况下,却没有这样明显的结构。目前,我使用扩展: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()在调用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

欢迎任何建议,真的。我还对理论方面的考虑以及如何在其他语言中实现这一点感兴趣。


共有1个答案

方英耀
2023-03-14

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

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\u data如何扩展transform\u data\u接口?它们没有相同的签名:“接口”使用一个参数,而实现接口的函数使用两个参数。这与大多数人所说的界面不符。

如果您要做的是强制一个给定函数与另一个函数具有相同的参数和返回值,那么您可以通过检查函数的参数来实现这一点。

  • stdlib中的inspect模块可以告诉您函数采用什么参数,特别是签名提供了一个很好的API

有关函数,请参见在python中组合函数。您可以修改其中的一个来执行我上面提到的那种检查。

至于其他功能性更强的语言是如何做到这一点的,我不确定。我看到我在上面链接的那篇接口文章中提到的类型类,看起来有一些很好的信息。

如果你对你正在做的事情有更多的细节或背景,请更新你的帖子!

 类似资料:
  • 在针对PHPCMS V9做二次开发的时候,您可以自定义一些全局函数且不影响以后官方升级 您自定义的文件请放置于该文件中 phpcms\libs\functions\extention.func.php或者以.func.php格式命名,放置于如下目录中 phpcms\libs\functions\autoload

  • 有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中

  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // He

  • 问题内容: View.OnClickListener()是函数还是接口?当我们尝试在android中设置onclicklistener()方法时,我们使用了新的View.OnClickListener(),据我所知,它会在此处引起我的困扰, 我们不需要初始化包含静态方法的类的对象即可使用这些方法。我们为什么要这样做? 当我们使用工具来实现接口时,我们不会调用该接口的静态方法。 所以有人可以告诉我我

  • Python 提供了一个 functools 的模块,该模块为高阶函数提供支持,partial 就是其中的一个函数,该函数的形式如下: functools.partial(func[,*args][, **kwargs]) 这里先举个例子,看看它是怎么用的。 假设有如下函数: def multiply(x, y): return x * y 现在,我们想返回某个数的双倍,即: >>> mu

  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?