Python : 객체가 시퀀스인지 확인
파이썬에서 시퀀스가 아닌지 쉽게 알 수있는 방법이 있습니까? 나는 그냥하려고 if x is not sequence
했지만 파이썬은 그것을 좋아하지 않았다
iter(x)
을 올릴 TypeError
경우 x
에 반복 할 수없는 -하지만 검사가 세트와 사전 "을 받아"로 "거부"가 아닌 다른 시퀀스와 같은 생각 None
과 숫자.
반면에 문자열 (대부분의 응용 프로그램 에서 시퀀스가 아닌 "단일 항목"을 고려하려는 경우) 은 실제로 시퀀스입니다 (문자열에 대해 특수한 경우가 아니면 모든 테스트에서 해당 항목을 확인합니다). 따라서 이러한 간단한 검사로는 종종 충분하지 않습니다.
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
당신은 문자열이된다 알게 될 것이다 여전히 "순서"(그들은 이후로 간주 됩니다 )하지만 적어도 당신은 길에서 dicts 및 세트를 얻을. "시퀀스가되는 것"이라는 개념에서 문자열을 제외하려면 다음을 사용하거나 collections.MutableSequence
(하지만 문자열과 같이 시퀀스이지만 변경할 수없는 튜플도 제외합니다.) 명시 적으로 수행 할 수 있습니다.
import collections
def issequenceforme(obj):
if isinstance(obj, basestring):
return False
return isinstance(obj, collections.Sequence)
맛을 내고 매운 맛을 내십시오!-)
아래 코드 스 니펫이 원하는 것을 수행한다고 생각합니다.
def is_sequence(obj):
return hasattr(type(obj), '__iter__')
파이썬은 덕 타이핑을 "고수"하므로 접근 방식 중 하나는 객체에 멤버 (메소드)가 있는지 확인하는 것입니다.
시퀀스에는 길이가 있고 항목 시퀀스가 있으며 슬라이스 [ 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__')
그것들은 모두 특별한 메소드이고, __len__()
항목 수를 __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
But most of the time you don't need this, just do what you want as if the object is a sequence and catch an exception if you wish. This is more pythonic.
The Python 2.6.5 documentation describes the following sequence types: string, Unicode string, list, tuple, buffer, and xrange.
def isSequence(obj):
return type(obj) in [str, unicode, list, tuple, buffer, xrange]
For Python 3 and 2.6+, you can check if it's a subclass of collections.Sequence
:
>>> import collections
>>> isinstance(myObject, collections.Sequence)
True
In Python 3.7 you must use collections.abc.Sequence
(collections.Sequence
will be removed in Python 3.8):
>>> import collections.abc
>>> isinstance(myObject, collections.abc.Sequence)
True
However, this won't work for duck-typed sequences which implement __len__()
and __getitem__()
but do not (as they should) subclass collections.Sequence
. But it will work for all the built-in Python sequence types: lists, tuples, strings, etc.
While all sequences are iterables, not all iterables are sequences (for example, sets and dictionaries are iterable but not sequences). Checking hasattr(type(obj), '__iter__')
will return True
for dictionaries and sets.
Why are you doing this? The normal way here is to require a certain type of thing (A sequence or a number or a file-like object, etc.) and then use it without checking anything. In Python, we don't typically use classes to carry semantic information but simply use the methods defined (this is called "duck typing"). We also prefer APIs where we know exactly what to expect; use keyword arguments, preprocessing, or defining another function if you want to change how a function works.
why ask why
try getting a length and if exception return false
def haslength(seq):
try:
len(seq)
except:
return False
return True
참고URL : https://stackoverflow.com/questions/2937114/python-check-if-an-object-is-a-sequence
'Program Tip' 카테고리의 다른 글
IntPtr.Zero는 null과 동일합니까? (0) | 2020.12.12 |
---|---|
특정 크기의 플롯 창 만들기 (0) | 2020.12.12 |
텍스트 하이라이트 이벤트? (0) | 2020.12.12 |
Button 매개 변수 "command"가 선언 될 때 실행되는 이유는 무엇입니까? (0) | 2020.12.12 |
자식 div를 부모 너비에 맞추는 크로스 브라우저 방법 (0) | 2020.12.12 |