2017-12-17 4 views
-1

나는 동일한 인수를 받아들이고 같은 타입을 반환하는 다양한 함수를 가지고있다. 그들은 비슷한 일들을 수행하고 (예를 들어 서로 다른 근사 방법과의 통합을 수행함) 이름 만 다를뿐입니다. 모든 유사 콘텐츠에 동일한 서명이 적용되도록하고 싶습니다.함수에 * interface * 같은 개념이 있습니까?

클래스로 래핑하여 수행 할 수 있지만 개념 상 이유가 없습니다. 그렇다면 함수에 대해 interface과 비슷한 개념이 있습니까? 즉, 문제는 함수 만 먼저 클래스 객체 (내가 파이썬/자바 스크립트에 주로 관심이 있어요)되는 언어에 대한 의미가 있습니다, 분명히

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

같은 일을 할 수있는 방법이있다.

파이썬에서
+0

컴파일 타임에 강제 적용 하시겠습니까? – schwobaseggl

+3

함수가 일류 객체 인 언어에서 호출 가능 시그니처 *는 해당 인터페이스의 일부입니다. 또한 두 가지 예제는 타이핑을하지 않는 언어입니다 (기본적으로 적어도 JS는 TypeScript가 있고 https://www.typescriptlang.org/docs/handbook/functions.html을 참조하십시오). 파이썬에는 타이핑이 있습니다. https : //docs.python을 참조하십시오.org/3/library/typing.html # callable). – jonrsharpe

+0

@schwobaseggl : 가능하면 좋습니다. 클래스의 메서드로 일어날 일들의 종류 –

답변

0

, 당신이이 장식을 사용하려면

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

이 당신이 args_types의 인수로 원하는 유형을 넣을 수도 장식으로

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 

을 유형 검사를 시행 할 수 있습니다 배열을 만들고 정의한 함수에 결과 인터페이스를 적용합니다. 'None-able'인수와 같은 이펙트에는 여전히 typing 라이브러리를 사용해야하며,이 코드를 수정하여 직접 구현할 수도 있습니다. 실제로이 데코레이터의 장점은 임의의 유형 검사 루틴을 정의 할 수 있다는 것입니다 (그렇지 않으면 typing이 더 좋을 수 있음).

입력 요구 사항이 모든 기능에 대해 정확히 동일하면 가장 바깥 쪽 장식자를 삭제하고 하드 코드 된 arg_types을 사용할 수 있습니다.

+0

아니면 최신 버전의 파이썬에서는'typing' 모듈을 사용할 수 있습니다. 잠재적으로 유용한 지식이지만,이 질문에 대답하지 않습니다. –

1

당신이 찾고있는 개념은 유형의입니다. 특히 이것은 유형의 값 유형이 아닌 유형의 유형이기 때문에 "상위 유형"유형입니다.

하스켈과 같은 언어에서 과 같은 함수를 전달해야합니다. 명시 적으로 타입을 지정하지 않으면 컴파일러가 타입을 명시 적으로 추론합니다. 그러나 다른 유형을 허용하는 다른 함수를 전달하려고하면 컴파일 오류가 발생합니다.

C#에는 대리자 형식이라는 함수 유형을 선언하기위한 특수 구문이 있습니다. Java 8+에는 기능 인터페이스의 개념 또는 하나의 메소드 만있는 인터페이스가 있으며 주어진 유형의 기능을 나타내는 객체를 쉽게 전달할 수있는 언어 기능이 있습니다.

JavaScript와 Python에서 객체는 실제로 최소한 명시 적으로 인터페이스를 갖고 있지 않습니다. 하지만 구현할 수있는 것은 프로토콜입니다. 여기서 인수는 특정 인수를 받아들이고 특정 방식으로 작동하는 함수 여야합니다. Python 표준 라이브러리에서이 좋은 예는 sorted() 함수에 대한 key 인수입니다.이 함수는 정렬 할 iterable의 한 항목을 허용하고 정렬 키로 사용할 유사한 객체를 반환하는 함수 여야합니다.

관련 문제