2010-11-24 7 views
2

방법을 결정할지 여부 I 객체가 일련의 여부를 확인하는 방법을 생각 할 수 있습니다객체가 순서

  • hasattr(object, '__iter__').
  • iter(object)을 호출하면 TypeError이 발생하는지 여부.

가장 파이썬이므로 내가 추가 (더 추한 생각하지만, 당신이 TypeError 잡은 일단 내가 예외를 발생, 두 번째 관용구를 사용하십시오 허가에게 보다는 용서 요청 객체가 시퀀스가 ​​아님을 확인하면 바람직하지 않은 "이중 예외"스택 추적이 발생합니다.

궁극적으로 개체가 __iter__ 메서드를 정의하여 개체가 시퀀스인지 여부를 결정할 수 있는지 확인하고 있습니까? 예를 들어, 이전 버전의 Python에서는 str__iter__ 메서드를 정의하지 않았고 __iter__을 정의하지 않고 __getitem__을 정의하고 사용하는 객체도 있습니다. 또는 정의 중입니다 __iter__시퀀스의 계약?

+0

내가 온라인에서 찾을 수있는 것 중에 [이 토론] (http://bytes.com/topic/python/answers/514838-how-test-if-object-sequence-iterable)은 꽤 관련성이있는 것 같았습니다. 늙은; [이 StackOverflow 질문] (http://stackoverflow.com/questions/1835018/python-check-if-an-object-is-a-list-or-tuple-but-not-string) 다소 관련이있었습니다. –

답변

4

isinstance(obj, collections.Sequence)을 사용하십시오. Abstract base classes이 이에 해당됩니다. 그들은 2.6 이전에는 존재하지 않았다. 이전 버전을 사용해야하는 경우에는 EAFP를 사용하는 것이 좋습니다.

+0

+1. 나는 문자 그대로 똑같은 것을 게시하려하고 있었다. 그러나 2.6 이전의 경우 비 시퀀스에는 '__iter__'이 (가) 있습니다. 'dict'. 이 문제를 해결하는 가장 좋은 방법은 무엇인지 잘 모르겠습니다. – aaronasterling

+1

이를 처리하는 가장 좋은 방법은 시퀀스가 ​​반복 가능하지 않은 경우 코드가 예상치 못한 결과를 줄 수 있음을 문서화하는 것일 수 있습니다. 실제로, 이것은 propably이 문제를 해킹하려고하는 경우에 상관없이 수행되어야합니다 ... – delnan

+1

isinstance (obj, collections.Sequence)가 아니어야합니까? – SilentGhost