복붙노트

[PYTHON] 파이썬 : 객체가 시퀀스인지 확인하십시오.

PYTHON

파이썬 : 객체가 시퀀스인지 확인하십시오.

파이썬에서는 뭔가가 시퀀스가 ​​아닌지를 쉽게 알 수있는 방법이 있습니까? 나는 단지 다음과 같이하려고 노력했다. x가 시퀀스가 ​​아니지만 파이썬이 그것을 좋아하지 않는다면

해결법

  1. ==============================

    1.x가 반복 될 수없는 경우 iter (x)는 TypeError를 발생 시키지만 None 및 numbers와 같은 다른 비 시퀀스를 "거부"하지만 검사는 집합과 사전을 "허용"합니다.

    x가 반복 될 수없는 경우 iter (x)는 TypeError를 발생 시키지만 None 및 numbers와 같은 다른 비 시퀀스를 "거부"하지만 검사는 집합과 사전을 "허용"합니다.

    다른 한편, 문자열 (대부분의 응용 프로그램이 시퀀스가 ​​아니라 "단일 항목"이라고 생각하는)은 실제로 시퀀스입니다 (따라서 문자열에 특수화되지 않는 한 모든 테스트에서 해당 시퀀스가 ​​확인 됨). 따라서 그러한 간단한 수표로는 충분하지 않을 수 있습니다.

    Python 2.6 이상에서는 추상 기본 클래스가 도입되었으며 다른 강력한 기능 중에서도 이러한 "카테고리 검사"를 체계적으로 지원합니다.

    >>> import collections
    >>> isinstance([], collections.Sequence)
    True
    >>> isinstance((), collections.Sequence)
    True
    >>> isinstance(23, collections.Sequence)
    False
    >>> isinstance('foo', collections.Sequence)
    True
    >>> isinstance({}, collections.Sequence)
    False
    >>> isinstance(set(), collections.Sequence)
    False
    

    문자열은 여전히 ​​"시퀀스"로 간주되지만 (적어도 그렇다고하더라도), 적어도 당신은 딕테이션을 얻고 그로부터 벗어나게됩니다. 문자열을 "시퀀스가 됨"개념에서 제외하려면 collections.MutableSequence를 사용할 수 있습니다 (단, 문자열과 마찬가지로 시퀀스이지만 변경할 수없는 튜플은 제외하거나 명시 적으로 수행하십시오).

    import collections
    
    def issequenceforme(obj):
        if isinstance(obj, basestring):
            return False
        return isinstance(obj, collections.Sequence)
    

    맛을 내기위한 계절, 더워지기! -)

  2. ==============================

    2.Python 2.6.5 문서에서는 문자열, 유니 코드 문자열, 목록, 튜플, 버퍼 및 xrange와 같은 시퀀스 유형을 설명합니다.

    Python 2.6.5 문서에서는 문자열, 유니 코드 문자열, 목록, 튜플, 버퍼 및 xrange와 같은 시퀀스 유형을 설명합니다.

    def isSequence(obj):
        return type(obj) in [str, unicode, list, tuple, buffer, xrange]
    
  3. ==============================

    3.아래 코드 스 니펫은 사용자가 원하는 것을 수행합니다.

    아래 코드 스 니펫은 사용자가 원하는 것을 수행합니다.

    def is_sequence(obj):
        return hasattr(type(obj), '__iter__')
    
  4. ==============================

    4.파이썬은 오리 타이핑을 "준수"하기 때문에 접근법 중 하나는 객체에 멤버 (메소드)가 있는지 확인하는 것입니다.

    파이썬은 오리 타이핑을 "준수"하기 때문에 접근법 중 하나는 객체에 멤버 (메소드)가 있는지 확인하는 것입니다.

    시퀀스는 길이를 가지며 항목 순서를 가지며 [doc]를 지원합니다. 그래서, 이렇게 될 것입니다 :

    def is_sequence(obj):
        t = type(obj)
        return hasattr(t, '__len__') and hasattr(t, '__getitem__')
        # additionally: and hasattr(t, '__setitem__') and hasattr(t, '__delitem__')
    

    __getitem __ (i)는 항목을 반환해야합니다 (순차적으로 i 번째 항목이지만 매핑이 아닌 순서로). __getitem __ (slice (start, stop, step)) 하위 시퀀스를 반환해야하며 __setitem__ 및 __delitem__은 예상대로입니다. 이것은 그러한 계약이지만, 객체가 실제로 이것들을 수행하는지의 여부는 객체가 계약을 준수하는지 여부에 달려 있습니다.

    위의 함수는 매핑을 위해 True를 반환합니다. dict, 매핑에는 이러한 메소드도 있습니다. 그것을 극복하기 위해, 당신은 더 무거운 작업을 할 수 있습니다 :

    def is_sequence(obj):
        try:
            len(obj)
            obj[0:0]
            return True
        except TypeError:
            return False
    

    하지만 대부분의 경우이 작업이 필요하지 않습니다. 객체가 시퀀스 인 것처럼 원하는 작업을 수행하고 원하는 경우 예외를 잡습니다. 이것은 좀 더 파이썬 적입니다.

  5. ==============================

    5.왜 이런 짓을하는? 여기서 일반적인 방법은 특정 유형의 것을 요구하는 것입니다 (순서 또는 숫자 또는 파일과 같은 객체 등). 그런 다음 아무 것도 확인하지 않고 사용하십시오. 파이썬에서 우리는 일반적으로 의미 정보를 전달하기 위해 클래스를 사용하지 않고 단순히 정의 된 메소드를 사용합니다 (이를 "오리 타이핑"이라고 함). 우리는 API가 무엇을 기대하는지 정확히 알고있는 API를 선호합니다. 함수의 작동 방식을 변경하려면 키워드 인수를 사용하거나 전처리하거나 다른 함수를 정의하십시오.

    왜 이런 짓을하는? 여기서 일반적인 방법은 특정 유형의 것을 요구하는 것입니다 (순서 또는 숫자 또는 파일과 같은 객체 등). 그런 다음 아무 것도 확인하지 않고 사용하십시오. 파이썬에서 우리는 일반적으로 의미 정보를 전달하기 위해 클래스를 사용하지 않고 단순히 정의 된 메소드를 사용합니다 (이를 "오리 타이핑"이라고 함). 우리는 API가 무엇을 기대하는지 정확히 알고있는 API를 선호합니다. 함수의 작동 방식을 변경하려면 키워드 인수를 사용하거나 전처리하거나 다른 함수를 정의하십시오.

  6. ==============================

    6.왜 물어보십시오

    왜 물어보십시오

    길이를 얻으려고 시도하고 예외가 false를 반환하면

    def haslength(seq):
        try:
            len(seq)
        except:
            return False
        return True
    
  7. from https://stackoverflow.com/questions/2937114/python-check-if-an-object-is-a-sequence by cc-by-sa and MIT license