2010-07-06 9 views
1

저는 소수의 모듈 (약 4 개 정도)으로 구성된 작은 파이썬 프로그램을 가지고 있습니다. 주 모듈은 튜플 목록을 생성하여 여러 개의 레코드를 나타냅니다. 이 튜플은 다른 모듈에서 반환 할 수있는 간단한 함수 (예 : get_records())를 통해 사용할 수 있습니다.파이썬 모듈간에 튜플을 교환해도 괜찮습니까?

그러나 좋은 디자인인지 잘 모르겠습니다. 문제는 다른 모듈이 튜플의 각 요소의 인덱스를 알아야한다는 것입니다. 이것은 모듈 간의 결합을 증가 시키며, 주 모듈을 사용하고자하는 사람에게는 그리 투명하지 않습니다.

나는 대안의 몇 가지 생각할 수 :

  1. 모듈 상수 (예를 들어, IDX_RECORD_TITLE, IDX_RECORD_STARTDATE 등)로 사용할 수있는 튜플 요소의 인덱스 값을 확인합니다. 이렇게하면 title = record[3]과 같은 마법 숫자가 필요 없습니다.

  2. 튜플을 사용하지 말고 레코드 클래스를 만들고 이러한 클래스 개체의 목록을 반환하십시오. 이점은 클래스 메소드가 record.get_title()과 같은 자체 설명 이름을 갖게된다는 것입니다.

  3. 대신 튜플을 사용하지 말고 사전을 사용하십시오. 따라서이 시나리오에서 함수는 사전 목록을 반환합니다. 사전 키가 자명하다는 장점이 있습니다 (모듈을 사용하는 누군가는이를 알고 있어야합니다). 그러나 이것은 거대한 간접비처럼 보입니다.

나는 (클래스/객체의 코딩 오버 헤드없이 주위의 화합물 데이터를 전달하는 것은 매우 쉽습니다) 파이썬의 큰 장점 중 하나가 될 튜플을 발견, 그래서 나는 현재 (1), 그러나 아직도 무슨 일이 것 궁금 사용 최선의 방법이되어야합니다.

답변

4

난 (튜플은 또한 객체이다) 튜플을 통해 객체를 전달에서 오버 헤드 나 복잡성을 볼 수 없습니다 IMO

튜플은 제약 그냥 본대로 당신의 목적은 쉽게 사용하지만, 제공하는 경우 예를 들어 데이터를 깨끗하게 표현하는 클래스로 전환하십시오.

class MyData(object): 
    def __init__(self, title, desc): 
     self.title = title 
     self.desc = desc 

게터 또는 설정 메소드를 추가 할 필요가 없습니다.

+0

필자는 게터와 세터의 오버 헤드에 대해 실제로 생각하고 있었지만 파이썬에서는 이것이 꼭 필요한 것은 아님을 잊어 버렸습니다. – Rabarberski

0

그런 경우에는 사전을 사용하는 경향이 있습니다. 나중에 코드를 사용하기 위해 다시 돌아 왔을 때 쉽게 이해할 수 있다면.

'거대한 오버 헤드'인지 여부는 알 수 없습니다. 나는 그것이 당신이 그것을 얼마나 자주하고 무엇을 위해 사용되는지에 달려 있다고 생각합니다. 가장 쉬운 솔루션으로 시작하여 실제로 필요할 때 최적화하십시오. 놀랍게도 나는 그런 것을 바꿀 필요가 거의 없다.

+0

오버 헤드는 각 '레코드'에있는 사전 키에 있습니다. 필자의 경우 레코드 수는 결코 크지 않을 것이므로 (<100) 오버 헤드는 실제로 무시할 만하지만 '옳은 느낌'은 ​​아닙니다. – Rabarberski

+0

나는 그 느낌에 동의한다. :) 나는 C++/Java 프로그래밍에 의해 손상되었는지 알지 못합니다. 그러나 어떤 이유로 든 값을 가지고있는 일종의 데이터 클래스를 가지고있는 것이 더 낫습니다. 이렇게하면 코드 완성과 함께 IDE에서 도움이되는 경우도 있습니다. :) gnibbler의'namedtuple' 제안은 좋은 타협처럼 보입니다. –

+1

그리고'namedtuple' 문서는 명시 적으로 다음과 같이 말합니다 : * 명명 된 튜플 인스턴스는 인스턴스 별 사전이 없으므로 가볍고 일반 튜플보다 더 많은 메모리가 필요하지 않습니다. * – Rabarberski

관련 문제