2010-04-15 12 views
18

무엇이 목록인지 확인하는 가장 쉬운 방법은 무엇입니까?목록이 있는지 확인하십시오.

방법 doSomethingab을 갖는다. 이 방법에서는 목록 a을 반복하여 처리합니다. 루프를 통과하기 전에 alist인지 확인하는 방법을 원합니다. 따라서 오류 또는 각 루프에서 문자를 가져 오는 문자열을 전달하는 불행한 상황을 피하십시오.

이 질문은 이전에 질문을 받았음에 틀림 없습니다. 건배.

+7

"파이썬 방식"은 사람들이 무엇인가를 전달할 수있게하는 것이라고 생각합니다. 귀하의 기능을 사용하여 코더를 신뢰하십시오. –

+7

"따라서 오류를 피하십시오"검사는 어떻게 "오류를 피합니까?" 그것은 여전히 ​​잘못입니다. 그리고 누군가가 실제로 올바르게 작동하는 튜플이나 다른리스트와 같은 객체를 사용한다면 어떨까요? 왜 당신이 생각지 못했던 목록과 같은 것들을 사용하지 못하게합니까? 이 오류를 어떻게 피할 수 있습니까? –

+0

인자 유형을 검사하는 유일한 시간은 함수가 정수 나 문자열과 같은 다른 유형에 대해 다른 작업을 수행하도록하려는 경우입니다. 그러나 그때조차도, 나는 보통 코드를 리팩터링하고 타입 검사를 제거해야한다. 요즘에는 실제로 ValueError를 발생시키는 코드를 작성하거나 입력이 좋지 않을 때 somesuch 할 가능성이 더 큽니다. C++과 달리 예외는 친구입니다. –

답변

13

더 쓰임새를 사용하려면 (나는. a.__iter__가있는 경우 당신은 또한 확인할 수 있습니다) 생각하지만,

if not isinstance(a, basestring): 
    ... 
+5

+1, 비 목록이 많아서 최고가 좋고 문자열 (평범하고 유니 코드 인 경우 'basestring'이 어디 있나)이 검은 양이 아니기 때문에 가장 좋아합니다. –

+1

이 코드를 사용하면 거의 확실하게 뭔가 잘못되어 있음을 나타냅니다. 일관된 API를 제공하는 경우에는 필요하지 않습니다. 또한 개념적으로 문자열이지만 다른 클래스의 인스턴스 인 객체를 사용하는 경우와 같이 유형을 의도 한대로 사용할 때 사용자 기대치를 위반할 수 있습니다. –

4

가 보통은 파이썬에서 유형 검사를 수행 할 수있는 좋은 스타일하지 간주하지만, 시도 할 것

if isinstance(a, list): 
    ... 

+1

맞습니다. 타입 검사에 좋은 스타일이 아닙니다. '__iter__'메소드를 검사하는 것은 어리석은 짓입니다. 'for item 만약 당신이'a'가 반복적으로 (못된, 장난 꾸러기!) 반복 할 수 없다고 의심할만한 이유가 있다면'TypeError'를 잡아라. –

+0

@Mike :''12345 ".__ iter__' -> AttributeError : 'str'object '__iter__'속성을 가지고 있지는 않지만'12345 ': x는'print x'에서 작동 함 – kennytm

+1

'__iter__'을 검사하는 것은 의미있는 차이가 아니라 구현 세부 사항에 의해서만 작동하며, 객체가 반복 가능한지 또는 직접적인 방법으로 표시되는지는 나타내지 않습니다. 문자열에 관한 정보. 객체가 오래된 반복자 프로토콜 (순차적 인 인덱스 호출)을 사용하거나이 경우처럼 C에서 못생긴 방식으로 구현되면 (예 :'__iter__' 메소드가 노출되지 않음), 결과는 다소 비현실적입니다. –

7

I'd like a way to make sure a is a list, before looping through

: 여전히 문자열이 있는지 확인하는 것 목록을 확인하지 않는, 스칼라로 문자열을 취급

함수를 문서화하십시오.

+1

이 솔루션은 가장 강력하고 유용하며 강력한 방법입니다. –

+1

다른 사람이 당신에게 이메일을 보내고 "이봐, 당신의 기능이 문자열에 이상한 일을하는"경우에는 자동으로 그 사람이 바보라는 것을 알게되는 이점이 있습니다. 컴파일러는 그렇게 할 수 없습니다. – detly

+1

하지만 가끔은 그들이 바보 인 것을 알고, 제거 할 수 없으며, 당신을 괴롭히지 않게하고, 새싹에 넣기 위해 작성할 수있는 코드가 있는지 궁금해 할 것입니다. 그것은 헛된 희망입니다. 항상 더 창조적 인 바보가 있습니다. 이것은 사람들이 USB 미사일 발사기와 같은 아이디어를 얻는 곳입니다. –

9

Typechecking은 코드의 보편성, 단순성 및 유지 관리 가능성을 해칩니다. 그것은 좋은, 관용적 인 Python 프로그램에서 거의 사용되지 않습니다.

는 두 가지 이유 사람들의 유형 체킹 할 수 있습니다 : 호출자가 잘못된 유형을 제공하는 경우

  1. 오류를 발행하려면.

    시간이별로 없습니다. 사용자가 수행중인 작업에 대해 호환되지 않는 유형을 제공하면 호환성에 도달하면 이미 오류가 발생합니다. 이것이 즉시 발생하지는 않을까 걱정이지만 일반적으로 오래 걸리지 않으며 코드가 더 강력하고 간단하고 효율적이며 작성하기 쉽습니다.

    사람들은 종종 사용자가 할 수있는 모든 바보 같은 것들을 잡을 수있는 희망으로 이것을 주장합니다. 사용자가 임의로 벙어리 작업을 수행하려는 경우 사용자를 막을 수있는 방법이 없습니다. Typechecking은 교체 된 함수의 드롭 인 대체 유형이거나 사용자가 함수가 실제로 다형성이어야하고 동일한 연산을 허용 할 수있는 다른 것을 제공해야한다는 것을 인식 할 때 자신의 유형으로 제공되는 사용자를 유지할 가능성이 있습니다.

    많은 사람들이 만든 많은 것들이 함께 맞아야하는 큰 시스템을 가지고 있다면, zope.interface과 같은 시스템을 사용하여 모든 것이 잘 맞는지 테스트 할 수 있습니다.

  2. 받은 인수의 유형에 따라 다른 작업을 수행합니다.

    API가 일관성이 없기 때문에 코드가 악화됩니다. 함수 나 메소드는 근본적으로 다른 것은 아니지만 한 가지를해야합니다. 이것은 일반적으로 지원할 가치가없는 기능입니다.

    하나의 일반적인 시나리오는 foo 또는 foos 목록 일 수있는 인수를 갖는 것입니다. 보다 깔끔한 솔루션은 단순히 foos 목록을 허용하는 것입니다. 코드가 더 간단하고 일관성이 있습니다.하나의 foo를 갖는 것이 중요하고 일반적인 사용 사례 인 경우, foos 목록을 허용하고 아무 것도 잃지 않는 다른 편리한 메소드/함수를 고려하는 것이 좋습니다. 첫 번째 API를 제공하는 것은 더 복잡하고 일관성이 떨어졌을뿐만 아니라, 유형이 예상되는 정확한 값이 아닐 때 중단됩니다. 파이썬에서는 실제 유형이 아닌 객체의 기능에 따라 객체를 구별합니다. 거의 항상 반복적 인 임의의 iterable이나 시퀀스 대신 list를 쓰는 것이 좋으며, foo가 필요없는 대신에 foo처럼 동작하는 것이면 좋습니다.

내가 알 수 있듯이, 어느 이유에서든 정상적인 상황에서 유형 검사를 수행 할만큼 충분한 이유는 없을 것이라고 생각합니다.

관련 문제