[python] 변수가리스트인지 터플인지 테스트

파이썬에서 변수에 목록이나 튜플이 있는지 테스트하는 가장 좋은 방법은 무엇입니까? (즉, 컬렉션)

isinstance()여기에 제안 악? http://www.canonical.org/~kragen/isinstance/

업데이트 : 목록과 문자열을 구별하려는 가장 일반적인 이유는 무한한 중첩 트리 / 문자열 목록 목록의 데이터 구조 등이 있는데 재귀 알고리즘으로 탐색하고 필요합니다. “리프”노드에 도달했을 때 알 수 있습니다.



답변

isinstance필요한 경우 계속 사용 하십시오. 커스텀 시퀀스, 반복자 및 실제로 필요한 다른 것들을 배제하기 때문에 다소 악합니다. 그러나 누군가가 예를 들어 문자열을 전달하는 경우 때때로 다르게 행동해야합니다. 내 선호는 명시 적으로 확인 str하거나 unicode좋아하는 것입니다.

import types
isinstance(var, types.StringTypes)

NB 마 혼동하지 types.StringType위해 types.StringTypes. 후자는 통합 str하고 unicode반대한다.

types모듈은 오히려 위를 사용하지 않는 게 좋을 그래서 만약 당신이 다른 방법에 대해 명시 적으로 확인할 수 있습니다, 단지 객체의 유형에 대해 직접 확인 찬성 쓸모 많은 것에 의해 간주 str하고 unicode다음과 같이 :

isinstance(var, (str, unicode)):

편집하다:

더 나은 방법은 다음과 같습니다.

isinstance(var, basestring)

편집 종료

이 중 하나를 마치면 정상적인 시퀀스를 얻는 것처럼 동작하여 비 시퀀스가 ​​적절한 예외를 발생시킬 수 있습니다.

유형 검사에 대해 “악한”것은 특정 유형의 객체에 대해 다르게 행동하기를 원치 않는 것이 아니라, 예상치 못한 객체 유형으로 올바른 행동을 수행하지 못하도록 인위적으로 기능을 제한하는 것입니다. 유형 확인되지 않은 최종 폴 백이 있으면이 제한을 제거합니다. 너무 많은 유형 검사는 리팩토링을 원할 수도 있음을 나타내는 코드 냄새이지만 반드시 getgo에서 피해야한다는 것을 의미하지는 않습니다.


답변

if type(x) is list:
    print 'a list'
elif type(x) is tuple:
    print 'a tuple'
else:
    print 'neither a tuple or a list'


답변

isinstance중복되지 않는 한 사용 하는 데 아무런 문제가 없습니다. 변수가 목록 / 튜플 일뿐이라면 인터페이스를 문서화하고 그대로 사용하십시오. 그렇지 않으면 수표는 완벽하게 합리적입니다.

if isinstance(a, collections.Iterable):
    # use as a container
else:
    # not a container!

이 유형의 검사에는 표준 문자열 startswith / endswith 메소드 와 같은 유용한 유스 케이스 가 있습니다 (정확하지만 튜플인지 확인하기 위해 명시 적 검사를 사용하여 CPython에서 C로 구현되지만 여러 가지 방법이 있습니다) 링크 된 기사에서 언급 했듯이이 문제를 해결하려면).

명시 적 검사는 종종 컨테이너로 객체를 사용하고 예외를 처리하는 것보다 낫습니다. 이로 인해 코드가 부분적으로 또는 불필요하게 실행되는 모든 종류의 문제가 발생할 수 있습니다.


답변

인수가 시퀀스 여야하는 것으로 문서화하고 시퀀스로 사용하십시오. 유형을 확인하지 마십시오.


답변

어때요 hasattr(a, "__iter__")?

반환 된 객체가 생성기로 반복 될 수 있는지 알려줍니다. 기본적으로 튜플과 목록은 문자열 유형이 아니라 문자열 유형이 될 수 있습니다.


답변

파이썬 2.8에서 type(list) is list반환 false
할 때이 끔찍한 방식으로 유형을 비교하는 것이 좋습니다.

if type(a) == type([]) :
  print "variable a is a list"

(적어도 내 시스템에서는 Mac OS X Yosemite에서 아나콘다를 사용함)


답변

파이썬은 “오리 타이핑 (Duck typing)”을 사용합니다. 즉, 오리와 같은 변수가 오리라면 오리 여야합니다. 귀하의 경우 반복 가능하거나 특정 색인에서 항목에 액세스하려고 할 수 있습니다. 당신은 이것을해야합니다 : 즉 블록 내부 for var:또는 var[idx]내부 에서 객체를 사용하십시오 try. 예외가 발생하면 오리가 아닙니다 …