2011-10-27 4 views
4

Pythonic이란 무엇인가에 대한 또 다른 질문입니다! 이 경우 응용 프로그램 도메인은 네트워크 알고리즘입니다 (예 : 노드, 가장자리, Dijkstra, 그런 종류의 ...). 이전에 강력하게 형식화 된 언어로 코딩 한 것입니다. 입니다.네트워크 데이터 구조에서 메서드를 처리하는 파이썬 방법

한편 파이썬에서는 클래스가 있습니다. Net; 이 클래스의 단일 인스턴스는 네트워크를 나타냅니다. 클래스 Edge 네트워크의 각 가장자리에 대해 인스턴스화 된 있습니다. 각 Edge 인스턴스에는 다른 것들 중에서 고유 한 id이 있습니다.

간혹 관련 Edge 인스턴스를 참조하여 가장자리를 제거하고 싶습니다. 다른 번에 그 id을 사용하여 Edge를 제거하고 싶습니다. 솔직히 말해서, 나는 어떤 변수가 Edges이고 어느 것이 ids인지 추적하지 못하기 시작했습니다. 내가이 일 - P를위한 C++를 선호하는 생각

그래서 나는 두 가지 솔루션을 제안 :

  1. 시작 헝가리어 표기법 시스템을 사용하는 - 그래서 나는 그들이 실제 에지 개체 또는 단지인지 알고 더 나은 내 변수의 이름을 나는 원하는 이드의 이드. 강력한 입력을 구현하십시오 - 이 아닌 것을 명시 적으로 거부하려면 remove_edge (Net의 메소드)을 지정하십시오. 래퍼 함수 remove_edge_id을 작성하여 id에서 관련 Edge을 찾은 다음 remove_edge을 호출하십시오. 이 함수는 마찬가지로 id이 아닌 것을 거부합니다.

  2. 오리 타이핑을 사용하십시오. remove_edge이 인수가 id 또는 Edge인지 확인하고 올바른 작업을 수행하십시오.

오늘은 언제나?

+0

당신이 모두 객체 참조를 사용하여 자신을 찾는 이유에 다시 스테핑 물어 가치가있을 수도 있습니다 ID를 사용하여 가장자리를 추적합니다. 그것은 C++ 습관에서 잡아 당겼습니까? 항상 다른 것을 사용하도록 다른 물건을 수정할 수 있습니까? –

+1

당신이 말하는 것은 '네트워크'가 아니라 '그래프'라고합니다. –

+0

공정한 포인트. 내 응용 프로그램 도메인의 용어로 눈이 멀었습니다. –

답변

4

오리 타이핑 솔루션은 훨씬 Pythonic입니다. 그러나 ID 또는 에지인지 여부를 확인하기 위해 인수를 테스트하는 대신, 더 일반적인 경우보다 먼저 처리하고, 작동하지 않는 경우 다른 방식으로 시도하십시오.

가끔씩 유일한 방법 인 명시 적 유형 검사를 사용하는 경우 type()이 아닌 isintance()을 사용하면 하위 클래스와 함께 사용할 수 있습니다.

변수의 이름을 잘못 지정하거나 이름을 잘못 지정할 수 있습니다. 이는 강력한 입력을 사용하는지 여부와 직결됩니다. Edge ID를 참조하는 변수와 Edge 인스턴스를 참조하는 변수가있는 경우 오리 유형 지정을 사용하는 경우에도 어떤 방식 으로든 구분하는 것이 현명한 것으로 보입니다. 나는 edgeedge_id을 헝가리보다는 오히려 사용하고 싶습니다.

+0

현명한 소리가 들리 겠지만 이것이 확실 할 수도 있지만 토론을 장려하기 위해 잠시 동안 질문을 열어두면 –

2

나는 두 가지를 혼합한다고 말할 수 있습니다.

개체의 이름을 알 수있는 개체의 이름을 사용하는 것이 좋습니다 (대부분은 개체를 보면서 수행 한 작업). 내 가장자리의 이름은 edge이고 내 가장자리의 ids는 edge_id입니다.

remove_edge에 대한 귀하의 오리 타이핑 아이디어를 사용했을 것입니다.

def remove_edge(edge): 
    if isinstance(edge, int): 
     edge = get_edge_from_id(edge) 
    #delete edge here!! 
+0

그냥 스택 오버플로가 발생합니까? :-) –

+0

Woops! 고쳐 주셔서 고마워요! – TorelTwiddler

1

당신이 ID로 당신의 가장자리를 제거하는 방법을 알고 있다면, 당신은 단순히이 같은 작업을 수행 할 수 있습니다

class Net: 
    def remove_edge(self, edge): 
     try: 
     self.remove_edge_by_id(edge.id) 
     except AttributeError:  # oups, edge was not an Edge, it has no id 
     self.remove_edge_by_id(edge) # it should be an id 
+0

@kindall이 제안한 가장 일반적인 사례를 먼저 처리하는 방법에 대한 코드 그림. 조금 더 명확하게 해줍니다! –