是否有像* interface *这样的概念用于函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有像* interface *这样的概念用于函数?相关的知识,希望对你有一定的参考价值。

我有各种函数接受相同的参数并返回相同的类型。他们做类似的事情(例如,使用不同的近似方法执行集成),并且仅在名称上有所不同。我想强制所有变体具有相同的签名。

它可以通过将它们包装到类中来完成,但是没有概念上的理由。那么,是否存在类似于interface的功能概念?也就是说,有没有办法做某事

abstract Double integration(Double[] xs, Double[] ys);
Double RiemmannIntegration implements integration(...) {...}

显然,这个问题只适用于函数是第一类对象的语言(我最感兴趣的是python / javascript)。

答案

您正在寻找的概念是函数的类型。具体来说,这是一种“高级”类型,因为它是一种类型而不是一种类型的值。

在像Haskell这样的语言中,您必须传递像这样的函数的参数。如果您没有明确命名该类型,编译器将为您推断它。但是如果你尝试传递一个接受不同类型的不同函数,那么你将得到一个编译错误。

C#有一种特殊的语法来声明一种函数类型,称为委托类型。 Java 8+具有功能接口的概念,或仅具有一种方法的接口,并且具有一些语言特性,以便更容易地传递表示给定类型的函数的对象。

在JavaScript和Python中,对象实际上没有接口,至少没有显式。但是你可以实现的是协议,你需要一个参数是一个接受某些参数并以某种方式运行的函数。 Python标准库中的一个很好的例子是key函数的sorted()参数:它需要是一个函数,它接受要排序的一个iterable项并返回一个可比较的对象用作排序键。

另一答案

在python中,可以强制执行类型检查

def type_check_decorator(args_types):
    def real_decorator(func):
        def wrapper(*args):
            # type checking
            for i, (a, t) in enumerate(zip(args, args_types)):
                if not isinstance(a, t):
                    raise ValueError('Type error on argument {}, should be {} but {} given'
                                     .format(i, t, type(a)))
            # execute real function
            return func(*args)
        return wrapper
    return real_decorator


my_interface = type_check_decorator([int, int])

@my_interface
def func1(a, b):
    return a + b

有了这个装饰你可能有

func1(1, 2)    # OK
func1(1.1, 2)  # ValueError: Type error on argument 0, should be <type 'int'> but <type 'float'> given

要使用此装饰器,请将args_types中所需参数的类型作为数组,并将结果接口应用于您定义的函数。您可能仍然需要使用typing库来实现“无法”参数等效果,或者通过修改此代码来实现您自己的参数。实际上,这个装饰器的优点是可以让你定义一个任意的类型检查例程(否则typing会更好)。

如果所有函数的输入要求完全相同,则可以删除最外面的装饰器并使用硬编码的arg_types

以上是关于是否有像* interface *这样的概念用于函数?的主要内容,如果未能解决你的问题,请参考以下文章

是否有像 ASM for Java Bytecode 这样的 CIL 静态分析库? [关闭]

用于错误检查的转换函数算不算好?

是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?

是否有像 scrollviewDidScroll 这样的 uipickerview 委托方法?

是否有像 TInterfacedObject 这样的非引用计数基类?

是否有像 pymedia 这样的库,但更新更多?