2014-11-23 2 views
1

java와 같은 정적 바인딩을 사용하는 언어에서 이름은 같지만 매개 변수가 다른 여러 함수를 모두 정의 할 수 있습니다. Python을 배우면서, 지금까지 나는 이것을 "안전 문제"(주로 bool_parameter="False")로 생각할 수 없었습니다. 따옴표로 인해 True으로 해석 될 수 있습니다. 나는 단지 더 조심해야한다고 생각했다.매개 변수 유형에 따라 다른 작업 수행 방법

이제 정적 바인딩의 부족이 단순히 불편한 상황을 발견했습니다. 어떤 조건을 선택하기 위해 필요하지 않기 때문에, 나는이 매우 편리 찾을

def del_item(int i): 
    # search item with (x == i, *) 
    # remove this item 

def del_item(String s): 
    # search item with (*, x == s) 
    # remove this item 

:

var = ((1, "foo"), (2, "bar"), (3, "potato")) 

한이 (의사 코드 같은 것을 할 수있는 정적 바인딩과 var에서 항목을 제거하려면이 tupel을 고려하시기 바랍니다 이 코드는 함수 중 하나 또는 둘 다에 과부하를 걸기 쉽게 결정할 수 있기 때문에 오버로드를 쉽게 만듭니다. 파이썬에서 이와 같은 상황을 처리하려고하면 불편을 겪습니다. ns는 타입을 검사하는 if-clause를 좋아한다.

더 좋은 방법이 있습니까?

+1

당신은 항상 클래스에 대해 삭제 작업을 수행 할 수 있으므로 삭제하도록 요청하면 내부에서 특정 삭제가 처리되는 것을 처리합니다. –

+0

이들은 두 개의 별개의 삭제입니다. 첫 번째 요소는 두 번째 인수의 첫 번째 요소를 찾습니다.일반적으로이 삭제 작업은 완전히 다른 상황에서 발생하므로 del_on_first_element 및 del_on_second_element 메소드는 유형 오버 로딩보다 훨씬 명확합니다. – Daniel

답변

2

파이썬에는 메소드 오버로딩이 없으므로 인수 유형을 확인해야합니다. 이 질문에 밖으로

def del_item(item): 
    if type(item) is int: 
     # search item with (x == item, *) 
     # remove this item 
    elif type(item) is str: 
     # search item with (*, x == s) 
     # remove this item 
    else: 
     # Maybe raise an exception? 
+0

나는 그것이 가정 한대로이 대답을 좋아한다. (원래 의도하지 않았던) 사실이다. 그러나 @deets는 좋은 해결 방법을 보여줍니다. 나는이 대답 중 어느 것을 받아 들여야하는지 조금 더 생각할 것입니다 ... – speendo

1

메소드/함수. 이것들은 파이썬과 함께 내장되어 있지는 않지만 제 3 자 라이브러리에 의해 로프로 처리 될 수 있습니다.

나는 몇 년 전 PEAK 규칙을 사용하여 행복하게 일해 왔지만 여전히 작동해야하지만 조금은 호의적이지 않은 것으로 보인다.

새로운 PEP 443 (단일 인수 디스패치)에는 외부 구현 인 singledispatch가 수반됩니다. 그와

https://pypi.python.org/pypi/singledispatch/3.4.0.3이 문제는 다음과 같이 해결할 수 :

from functools import partial 
from singledispatch import singledispatch 


var = ((1, "foo"), (2, "bar"), (3, "potato")) 


@singledispatch 
def del_predicate(value): 
    pass 


@del_predicate.register(int) 
def _(v, candidate): 
    return v == candidate[0] 

@del_predicate.register(str) 
def _(v, candidate): 
    return v == candidate[1] 


def neg(f): 
    def _f(*args): 
     return not f(*args) 
    return _f 

print filter(neg(partial(del_predicate, "foo")), var) 
print filter(neg(partial(del_predicate, 2)), var) 
+0

원칙적으로, 문제는 실제로 파이썬에서 쉽게 해결되지 않습니다. 그러나 좋은 해결 방법을 제공합니다. 나는 당신의 대답을 좋아하고 @DanielGibbs도 대답합니다. 나는 좀 더 생각해야 할 대답을 어느 정도 받아 들여야한다. – speendo

+1

나는 그와 같은 문제가 얼마나 빈번히 발생하는지에 따라 결정을 내릴 것이므로 문제를 해결하기 위해 새로운 관용적 방법을 도입하는 것이 정당하다. 코드는 작성된 것보다 더 자주 읽 힙니다. 더 이상 지식 기반 유형 파견이 없으면 Daniel의 대답을 이해할 수 있습니다. 그걸 판사로 삼으십시오. – deets

+0

나는 또한 python3에서 어떤 종류의 선택적 정적 타이핑이 소개 될 것이라는 소문을 들었습니다. 그러나, 나는 그것에 대한 진짜 증거를 찾지 못했습니다. – speendo

0

당신이주는 특별한 경우는 오버로드가 어쨌든 필요하지 않은 일처럼 보인다.

def del_item(id): 
    return tuple(item for item in var if not id in item) 

또 다른 옵션이 그것을 가지고하지 않는 문제로 간주하지 왜 이해하는 데 도움이 선택적 키워드 인수

def del_item(string_id=None, number_id=None): 
    if string_id is not None: 
     return tuple(item for item in var if not item[1] == string_id) 
    return tuple(item for item in var if not item[0] == number_id) 

파이썬 오버로드에 대한 이전의 많은 질문이 있습니다

this is one answer을 사용하는 것입니다.

관련 문제