2014-03-14 3 views
0

내 모듈의 탭 완성을 깨끗하게 유지하고 싶습니다. 클래스를 반환하는 함수가 있습니다. 그 클래스는 함수를 통해서만 액세스 할 수 있기 때문에 함수 내부에 클래스를 중첩하여 함수가 정의 된 모듈에서 클래스를 숨길 생각을하고있었습니다. 이 방법이나 권장하지 않는 다른 방법을 사용하지 않을 이유가 있습니까?함수 결과 파이썬에 중첩 된 클래스 사용, 단점은 무엇입니까?

거친 코드 :

def search(): 

    #Nested class 
    #------------------------------ 
    class SearchResult(): 

      def __init__(self, data): 
        #do stuff 
    #---------------------------------  

    #do stuff - define data 

    return SearchResult(data) 
+0

왜 '모듈에서 숨기시겠습니까?' – zhangxaochen

+0

그가 '모듈 가져 오기'에서 탭 완성을했을 때 그 기능 밖에서 독립적 인'SearchResult'를 만들 이유가 없기 때문에'SearchResult'를 보여주지 않는다고 생각합니다. – aruisdante

+3

제 의견 : 함수 밖에서'SearchResult'를 정의하십시오. 그러나'_SearchResult'라고 이름을 붙여서 "private"이고 일반 용도가 아니라는 것을 강조하십시오. 그러나 또 다른 메모에서'SearchResult'는 어떤 메소드를 정의합니까? 없으면 왜 클래스를 정의해야합니까? 'SearchResult'가'namedtuple' 또는 단순한 튜플을 반환하도록하십시오. – chepner

답변

2

함수 내부에 정의 된 클래스를 갖는 것이 단점은 다른 곳에서 참조 할 방법이 없다는 것입니다. 예를 들어 다른 코드는 SearchResult 클래스를 참조 할 방법이 없기 때문에 SearchResult 인스턴스인지 여부를 확인하기 위해 isinstance을 사용할 수 없습니다.

또 다른 문제는 반환 값이 기술적으로 같은 유형이 아닐 수 있다는 것입니다. search 함수가 실행될 때마다 서로 실행하여 생성 된 SearchResult 클래스와 다른 클래스 인 SearchResult 클래스가 만들어지기 때문입니다. 따라서 두 결과 (ab)가있는 경우 type(a) == type(b)이 거짓입니다. 대부분의 경우 문제가되지는 않지만 가끔 어색해질 수 있습니다.

이런 식으로 일하는 유일한 이유는 탭 완성 목록에 클래스를 표시하지 않으려는 경우 더 나은 방법으로 숨길 수 있다는 것입니다. 어떤 IDE를 사용하고 어떻게 탭 완성이 작동하는지). 뭔가를 시도하는 것이 좋습니다 클래스 이름 접두사가있는 밑줄 (_SearchResult) 탭을 완료 할 수 있습니다 무시할 수 있기 때문에 선두 언더 코어는 일반적으로 뭔가 "개인"임을 나타 내기 위해 이해됩니다.

0

몇 가지 단점이 있습니다. search의 모든 호출의 경우, 다른 사람과 구별되는 새로운 SearchResult 클래스를 만들 것이다, 그래서, 예를 들면 :

>>> result_1 = search() 
>>> result_2 = search() 
>>> type(result_1) == type(result_2) 
False 

인정 하듯이, 당신은 아마 당신의 코드에서이 일을하지 말아야하지만, 각 클래스 염두에 두어야 그것도 중요하지 않을 수도 있지만, 또한 메모리를 차지합니다. 클래스를 로컬에 정의하면 코드를 디버깅 할 때 유용 할 수 있으므로 전역 적으로 액세스 할 수 없게됩니다.

전 세계에 SearchResult을 정의하기 위해 chepner's recommendation을 되풀이하지만 내부에 있음을 강조하기 위해 밑줄을 붙일 수도 있습니다.