변수가 리스트인지 태플인지 검정
python에서 변수가 목록 또는 태플을 포함하는지 테스트하는 가장 좋은 방법은 무엇입니까? (예: 모음)
이isinstance()
여기 제시된 것처럼 악랄한가요?http://www.canonical.org/ ~ kragen / 인스턴스 /
업데이트: 목록을 문자열과 구별하는 가장 일반적인 이유는 재귀 알고리즘으로 탐색 중인 문자열 목록 목록 목록으로 구성된 무한히 깊은 중첩 트리/데이터 구조가 있는 경우이며, "리프" 노드를 눌렀는지 알아야 합니다.
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
필요하시면 말씀하세요.커스텀 시퀀스, 반복기, 기타 실제로 필요한 것은 제외되므로 다소 악의가 있습니다.다만, 예를 들면, 누군가가 문자열을 건네주는 경우는, 다른 동작이 필요하게 되는 경우가 있습니다.내 취향은 명시적으로 체크하는 것이다.str
또는unicode
다음과 같이 합니다.
import types
isinstance(var, types.StringTypes)
N.B. 실수하지 마세요.types.StringType
위해서types.StringTypes
후자는 다음을 포함합니다.str
그리고.unicode
물건들.
그types
module은 오브젝트 타입에 대해 직접 체크하는 것만으로 많은 사람들이 쓸모없다고 생각하기 때문에 위의 것을 사용하지 않는 것이 좋다면 대신 명시적으로 체크할 수 있습니다.str
그리고.unicode
, 다음과 같이 합니다.
isinstance(var, (str, unicode)):
편집:
더 좋은 점은:
isinstance(var, basestring)
편집 종료
어느 쪽인가 하면, 정상적인 시퀀스를 취득하고 있는 것처럼 행동해, 시퀀스가 없는 경우는 적절한 예외를 발생시킬 수 있습니다.
타입 체크의 「악」은, 특정의 오브젝트에 대해서 다른 동작을 하고 싶다고 하는 것이 아니고, 예기치 않은 오브젝트 타입으로 올바른 동작을 인위적으로 제한하는 것입니다.타입 체크가 되어 있지 않은 최종 폴백이 있는 경우는, 이 제한을 삭제합니다.너무 많은 타입 체크는 코드 냄새로 리팩터링을 하고 싶다는 것을 나타내는 것이므로 주의해 주십시오.그러나 반드시 처음부터 피해야 하는 것은 아닙니다.
사용해도 문제 없습니다.isinstance
중복되지 않는 한요.변수가 목록/태플만 되어야 하는 경우 인터페이스를 문서화하여 그대로 사용합니다.그렇지 않으면 수표가 완전히 합리적입니다.
if isinstance(a, collections.Iterable):
# use as a container
else:
# not a container!
이러한 유형의 검사에는 표준 문자열 starts with/ends with 메서드 등 몇 가지 유용한 사용 사례가 있습니다(정확한 것은 이것이 태플인지 확인하기 위한 명시적 검사를 사용하여 CPython의 C에 구현되어 있지만, 이 문제를 해결할 수 있는 방법은 링크한 기사에서 설명한 바와 같이 여러 가지가 있습니다.
명시적 검사는 종종 개체를 컨테이너로 사용하여 예외를 처리하는 것보다 낫습니다. 이 경우 코드가 부분적으로 또는 불필요하게 실행되는 모든 종류의 문제가 발생할 수 있습니다.
인수를 시퀀스여야 한다고 문서화하여 시퀀스로 사용합니다.유형을 확인하지 마십시오.
.8 Python 2.의 경우type(list) is list
false
저는 이 끔찍한 방법으로 유형을 비교할 것을 제안합니다.
if type(a) == type([]) :
print "variable a is a list"
(최소한 내 시스템에서는 Mac OS X Yosemite에서 아나콘다 사용)
럼럼 ?? ? how ? how how how how?hasattr(a, "__iter__")
반환된 개체를 생성기로 반복할 수 있는지 여부를 알려줍니다.기본적으로는 튜플 및 목록에서는 문자열 유형을 사용할 수 있지만 문자열 유형은 사용할 수 없습니다.
>>> l = []
>>> l.__class__.__name__ in ('list', 'tuple')
True
Python의 "Duck Typing"은 Duck typing 。이 경우 반복 가능하거나 특정 색인의 항목에 액세스하려고 할 수 있습니다. '사용하다', '사용하다', '사용하다'에 있는 합니다.for var:
★★★★★★★★★★★★★★★★★」var[idx]
a try
블록, 예외적으로 말하면 그건 오리가 아니라...
변수가 목록인지 태플인지 또는 일반적으로 변수 유형을 확인하는 또 다른 쉬운 방법은 다음과 같습니다.
def islist(obj):
if ("list" in str(type(obj)) ): return True
else : return False
.foo[123]
'', '아까', '아까', '아까', '아까'가 있는지 확인할 수 .__getitem__
attribute(인덱스로 할 때것와 attribute('python')를 지정합니다.hasattr(foo, '__getitem__')
모든 것을 함수 인수로 처리하려면 더 복잡한 테스트가 필요합니다.
type(a) != type('') and hasattr(a, "__iter__")
어떤 하고 ,, 보, 보, 보, 보, 보, 보, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, only, ,type(a) != type('')
또, 스트링의 처리 패스가 심플하거나, 착하게 스플릿을 하거나 하는 일이 있기 때문에, 스트링에 소리를 지르고 싶지 않고, 이상한 것을 보내도 예외로 해 주세요.
원칙적으로는 위의 Ignacio에 동의하지만, type을 사용하여 tuple이나 list를 확인할 수도 있습니다.
>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')
가장 우아한 것은 아니지만, 저는 (Python 3의 경우) 다음과 같이 생각합니다.
if hasattr(instance, '__iter__') and not isinstance(instance, (str, bytes)):
...
이를 통해 다른 반복 가능(Django 쿼리 세트 등)이 허용되지만 문자열 및 바이테스트링은 제외됩니다.일반적으로 단일 개체 ID 또는 개체 ID 목록을 받아들이는 함수에서 사용합니다.오브젝트 ID가 문자열일 수 있기 때문에 한 글자씩 반복하고 싶지 않습니다.:)
있잖아요...내가 바보 같은 짓을 하고 있는지는 몰라도, 난 이렇게 하고 있어.
try:
len(thing)
except:
# not a list
예를 들어, 길이를 알 수 있다면, 한 가지 이상일 거야.
편집: 목록에 없는 항목이 문자열이면 작동하지 않는다는 것을 방금 깨달았습니다. 문자열은 기본적으로 문자 목록이기 때문입니다.
언급URL : https://stackoverflow.com/questions/2184955/test-if-a-variable-is-a-list-or-tuple
'source' 카테고리의 다른 글
AngularJS: 동적으로 추가된 필드가 FormController에 등록되지 않았습니다. (0) | 2023.03.15 |
---|---|
Angular 템플릿에 코멘트(출력 HTML이 아닌 개발자용)를 추가하려면 어떻게 해야 합니까? (0) | 2023.03.15 |
프로그래밍 방식으로 새 워드프레스 페이지를 만드는 방법 (0) | 2023.03.15 |
스프링 부트 테스트 구성 (0) | 2023.03.15 |
Wordpress - 사용자 지정 게시 유형에 피처링 이미지 메타 상자가 표시되지 않음 (0) | 2023.03.15 |