2011-10-05 3 views
0

저는 C# 구문에 익숙합니다. 예를 들어 List<string> MyList으로 문자열 목록을 만듭니다.Python 2.5에서 "형식화 된"목록 만들기

파이썬에서 콜렉션 유형에없는 유형을 추가하려고하면 비슷한 구문이 실패합니다.

+0

사용자 지정 클래스를 만들어야합니다. 이러한 기능은 Python에 존재하지 않습니다. – NullUserException

+0

이것은 파이썬 방식이 아닙니다. 이것이 코드에서 내부적으로 사용된다면, 문자열 이외의 것을리스트에 넣지 마십시오. 이것이 당신이 쓰고있는 모듈의 사용자에게 드러내는 것이라면, 올바르게 문서화하십시오. 이 방법은 문자열처럼 작동하지만 반드시 문자열 일 필요는없는 모든 것을 포함 할 수 있습니다. 자세한 정보는 "duck typing"및 EAFP를 참조하십시오. – yak

답변

1

는, 파이썬은 내장처럼 아무것도하지 않습니다.

당신이 그런 일을하고 싶었다면, 당신은 허용 내장에 list() 클래스 및 수 있도록 모든 방법을 서브 클래스 것 요소를 삽입하거나 추가하면 형식 검사가 수행됩니다. 또는 형식 검사 대신 사용자 지정 메서드가 형식을 강제 변환하도록 만들 수 있습니다.

다음은 int() 값만 보유 할 목록의 구현 예입니다. 삽입하거나 추가하려고하는 모든 것을 강요하고 적절한 오류를 발생시킵니다. 내가 내장 된 서브 타입 list(), 그래서 내가 쓴 코드는 단지 예외입니다; 여기에 표시되지 않은 항목은 기본 list() 유형과 정확히 일치합니다. 방금 몇 가지 방법을 사용해야했습니다. 또한 목록이나 다른 시퀀스를 받아들이고 객체를 초기화하는 사용자 정의 .__init__() 메소드를 제공했습니다.

이것은 불완전한 구현입니다. 예를 들어 .insert() 메서드를 재정의하지 않습니다. 하지만 기본 생각을 보여줄 것이라고 생각합니다. 실제로 IntList() 클래스를 원한다면이 클래스를 기본 클래스로 사용할 수 있습니다.

class IntList(list): 
    def __init__(self, seq=None): 
     if seq is not None: 
      try: 
       for x in seq: 
        self.append(int(x)) 
      except ValueError: 
       raise ValueError, "can only use int values to init IntList" 
    def __setitem__(self, i, x): 
     try: 
      list.__setitem__(self, i, int(x)) 
     except ValueError: 
      raise ValueError, "can only set int values into IntList" 
    def append(self, x): 
     try: 
      list.append(self, int(x)) 
     except ValueError: 
      raise ValueError, "can only append int values to IntList" 


lst = [0, 1, 't'] 

try: 
    o = IntList(lst) # raises exception 
except ValueError: 
    print("lst has a 't' in it") 

o = IntList(range(3)) # works 

try: 
    o[1] = 't' 
except ValueError: 
    print("cannot set to 't'") 

o[1] = 2 # works 

o.append(4) # works 
o.append('t') # raises error 

위의 인쇄 :

lst has a 't' in it 
cannot set to 't' 
Traceback (most recent call last): 
    File "t.py", line 38, in <module> 
    o.append('t') # raises error 
    File "t.py", line 18, in append 
    raise ValueError, "can only append int values to IntList" 
ValueError: can only append int values to IntList 

.__init__() 기능의 목록 인수 None로 설정된 기본 인수를 갖는 일반적인 파이썬 관용구가 있습니다. 이는 디폴트 값 목록이 컴파일 타임에 한 번만 평가되고이 목록에 대한 참조 저장은 해당 클래스의 모든 인스턴스가 동일한 인스턴스를 공유한다는 것을 의미하기 때문입니다. 이 경우, 우리는 루프를 반복하면서 루프를 반복하고, 우리 자신의 복사본을 만들었 기 때문에 실제로이 관용구를 할 필요가 없다. 그러나 나는 이것을 읽는 초보자를 위해 이디엄의 예를 보여주고 싶었다.

1

아니요. __*item__() methods을 적절하게 구현하는 사용자 지정 클래스를 만들어야합니다. 다른 사람이 말했듯이

+0

저는 여전히 파이썬 학습자입니다. __ * item __() 메소드를 실제로 사용하는 예제가 있습니까? (특히 Google 애플 리케이션 엔진에서 일하고 있기 때문에 Python 2.5를 사용) –

+0

위의 대답에서 "방법"이라는 단어를 클릭 해보십시오. 이것은 파이썬 문서 페이지에 대한 링크입니다. – steveha

관련 문제