IT story

변수가리스트인지 터플인지 테스트

hot-time 2020. 4. 28. 08:27
반응형

변수가리스트인지 터플인지 테스트


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

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예외가 발생하면 오리가 아닙니다 ...


>>> l = []
>>> l.__class__.__name__ in ('list', 'tuple')
True

If you just need to know if you can use the foo[123] notation with the variable, you can check for the existence of a __getitem__ attribute (which is what python calls when you access by index) with hasattr(foo, '__getitem__')


In principle, I agree with Ignacio, above, but you can also use type to check if something is a tuple or a list.

>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')

Has to be more complex test if you really want to handle just about anything as function argument.

type(a) != type('') and hasattr(a, "__iter__")

Although, usually it's enough to just spell out that a function expects iterable and then check only type(a) != type('').

Also it may happen that for a string you have a simple processing path or you are going to be nice and do a split etc., so you don't want to yell at strings and if someone sends you something weird, just let him have an exception.


Another easy way to find out if a variable is either list or tuple or generally check variable type would be :

    def islist(obj):

        if ("list" in str(type(obj)) ): return True

        else : return False

참고URL : https://stackoverflow.com/questions/2184955/test-if-a-variable-is-a-list-or-tuple

반응형