변수가 목록인지, 사전인지, 아니면 다른 것인지 확인하는 간단한 방법이 있습니까? 두 유형 중 하나일 수 있는 개체를 다시 가져오고 차이점을 말할 수 있어야 합니다.
질문자 :Justin Ethier
개체 유형을 식별하는 데 도움이 되는 두 가지 기본 제공 함수가 있습니다. 객체의 정확한 유형이 필요한 경우 type()
사용하고 무언가에 대해 객체의 유형을 확인하려면 isinstance()
를 사용할 수 있습니다. isinstance()
는 매우 강력하고 유형 상속도 지원하기 때문에 대부분 사용하려고 합니다.
객체의 실제 유형을 얻으려면 내장 type()
함수를 사용합니다. 객체를 유일한 매개변수로 전달하면 해당 객체의 유형 객체가 반환됩니다.
>>> type([]) is list True >>> type({}) is dict True >>> type('') is str True >>> type(0) is int True
이것은 물론 사용자 정의 유형에도 작동합니다.
>>> class Test1 (object): pass >>> class Test2 (Test1): pass >>> a = Test1() >>> b = Test2() >>> type(a) is Test1 True >>> type(b) is Test2 True
type()
은 객체의 즉각적인 유형만 반환하지만 유형 상속에 대해서는 알려줄 수 없습니다.
>>> type(b) is Test1 False
이를 커버하려면 isinstance
함수를 사용해야 합니다. 이것은 물론 내장 유형에서도 작동합니다.
>>> isinstance(b, Test1) True >>> isinstance(b, Test2) True >>> isinstance(a, Test1) True >>> isinstance(a, Test2) False >>> isinstance([], list) True >>> isinstance({}, dict) True
isinstance()
는 파생 유형도 허용하므로 일반적으로 객체 유형을 확인하는 데 선호되는 방법입니다. 따라서 (어떤 이유로든) 실제로 유형 객체가 필요하지 않는 한 isinstance()
를 사용하는 것이 type()
보다 선호됩니다.
isinstance()
의 두 번째 매개변수도 유형의 튜플을 허용하므로 한 번에 여러 유형을 확인할 수 있습니다. 객체가 다음 유형 중 하나인 경우 isinstance
>>> isinstance([], (tuple, list, set)) True
poke
type()
을 사용하여 그렇게 할 수 있습니다.
>>> a = [] >>> type(a) <type 'list'> >>> f = () >>> type(f) <type 'tuple'>
brettkelly
try
... except
블록을 사용하는 것이 더 Pythonic일 수 있습니다. 그렇게 하면 목록처럼 꽥꽥거리는 클래스가 있거나 dict처럼 꽥꽥거리는 클래스가 있는 경우 해당 유형이 실제로 무엇인지에 관계없이 제대로 작동합니다.
명확히 하자면, 변수 유형 간의 "차이점을 알려주는" 선호되는 방법은 덕 타이핑(duck typing) 이라는 방법을 사용하는 것입니다. 변수가 응답하는 메소드(및 반환 유형)가 서브루틴이 예상하는 것이라면 예상한 대로 처리하십시오. 되려고. 예를 들어, 대괄호 연산자를 getattr
및 setattr
오버로드하지만 재미있는 내부 체계를 사용하는 클래스가 있는 경우 에뮬레이트하려는 경우 사전처럼 동작하는 것이 적절할 것입니다.
type(A) 의 또 다른 문제 type(A) is type(B)
검사라는 점입니다. A
B
의 하위 클래스인 경우 프로그래밍 방식으로 true
false
평가된다는 것입니다. 객체가 목록의 하위 클래스인 경우 목록처럼 작동해야 합니다. 다른 답변에 표시된 유형을 확인하면 이를 방지할 수 있습니다. ( isinstance
는 작동합니다).
Seth Johnson
객체의 인스턴스에는 다음도 있습니다.
__class__
기인하다. 다음은 Python 3.3 콘솔에서 가져온 샘플입니다.
>>> str = "str" >>> str.__class__ <class 'str'> >>> i = 2 >>> i.__class__ <class 'int'> >>> class Test(): ... pass ... >>> a = Test() >>> a.__class__ <class '__main__.Test'>
python 3.x 및 New-Style 클래스(Python 2.6에서 선택적으로 사용할 수 있음)에서는 클래스와 유형이 병합되었으며 때때로 예기치 않은 결과가 발생할 수 있습니다. 주로 이런 이유로 종류 / 클래스를 테스트 나의 마음에 드는 방법은이다 isinstance 기능이 내장되어 있습니다.
Lorenzo Persichetti
Python 객체의 유형 결정
와 객체의 유형 결정 type
>>> obj = object() >>> type(obj) <class 'object'>
__class__
와 같은 이중 밑줄 속성을 피하십시오. 의미상 공개되지 않으며, 이 경우에는 아닐 수도 있지만 내장 함수는 일반적으로 더 나은 동작을 합니다.
>>> obj.__class__ # avoid this! <class 'object'>
유형 검사
변수가 목록인지, 사전인지, 아니면 다른 것인지 확인하는 간단한 방법이 있습니까? 두 유형 중 하나일 수 있는 개체를 다시 가져오고 차이점을 말할 수 있어야 합니다.
그건 다른 질문입니다. type을 사용하지 마세요 isinstance
사용하세요.
def foo(obj): """given a string with items separated by spaces, or a list or tuple, do something sensible """ if isinstance(obj, str): obj = str.split() return _foo_handles_only_lists_or_tuples(obj)
str
을 서브클래싱하여 영리하거나 합리적인 일을 할 수 있는 경우를 다룹니다. Liskov Substitution의 원칙에 따라 코드를 손상시키지 않고 서브클래스 인스턴스를 사용할 수 있기를 원하며 isinstance
는 이를 지원합니다.
추상화 사용
collections
또는 numbers
에서 특정 추상 기본 클래스를 찾을 수 있다는 것입니다.
from collections import Iterable from numbers import Number def bar(obj): """does something sensible with an iterable of numbers, or just one number """ if isinstance(obj, Number): # make it a 1-tuple obj = (obj,) if not isinstance(obj, Iterable): raise TypeError('obj must be either a number or iterable of numbers') return _bar_sensible_with_iterable(obj)
또는 명시적으로 유형 확인하지 마십시오.
또는 가장 좋은 방법은 덕 타이핑을 사용하고 코드를 명시적으로 유형 검사하지 않는 것입니다. 덕 타이핑은 더 우아하고 덜 장황하게 Liskov 대체를 지원합니다.
def baz(obj): """given an obj, a dict (or anything with an .items method) do something sensible with each key-value pair """ for key, value in obj.items(): _baz_something_sensible(key, value)
결론
-
type
을 사용하여 실제로 인스턴스의 클래스를 가져옵니다. -
isinstance
를 사용하여 실제 하위 클래스 또는 등록된 추상화를 명시적으로 확인합니다. - 그리고 의미가 있는 곳에서는 유형 검사를 피하세요.
Aaron Hall
type()
또는 isinstance()
사용할 수 있습니다.
>>> type([]) is list True
같은 이름의 현재 범위에 변수를 할당하여 list
이나 다른 유형을 방해할 수 있다는 점에 주의하십시오.
>>> the_d = {} >>> t = lambda x: "aight" if type(x) is dict else "NOPE" >>> t(the_d) 'aight' >>> dict = "dude." >>> t(the_d) 'NOPE'
dict
가 문자열에 재할당되는 것을 볼 수 있습니다. 따라서 테스트는 다음과 같습니다.
type({}) is dict
...실패.
이 문제를 해결하고 type()
더 신중하게 사용하려면 다음을 수행하십시오.
>>> import __builtin__ >>> the_d = {} >>> type({}) is dict True >>> dict ="" >>> type({}) is dict False >>> type({}) is __builtin__.dict True
deed02392
isinstance 사용 조심
isinstance(True, bool) True >>> isinstance(True, int) True
하지만 유형
type(True) == bool True >>> type(True) == int False
tnusraddinov
질문이 꽤 오래되었지만 적절한 방법을 찾는 동안이 문제를 우연히 발견 했으며 적어도 Python 2.x의 경우 여전히 명확히해야한다고 생각합니다 (Python 3은 확인하지 않았지만 문제가 클래식 클래스에서 발생하기 때문에 그러한 버전에서는 사라졌지만 아마도 중요하지 않을 것입니다).
여기서 제목의 질문에 답하려고 합니다 . 임의 개체의 유형을 어떻게 결정할 수 있습니까? isinstance를 사용하거나 사용하지 않는 것에 대한 다른 제안은 많은 의견과 답변에서 괜찮지만 저는 이러한 문제를 다루지 않습니다.
type()
접근 방식의 주요 문제 는 이전 스타일 인스턴스에서 제대로 작동하지 않는다는 것입니다 .
class One: pass class Two: pass o = One() t = Two() o_type = type(o) t_type = type(t) print "Are o and t instances of the same class?", o_type is t_type
이 스니펫을 실행하면 다음이 생성됩니다.
Are o and t instances of the same class? True
나는 이것이 대부분의 사람들이 기대하는 것이 아니라고 주장한다.
__class__
접근 방식은 정확성에 가장 가깝지만 한 가지 중요한 경우에는 작동하지 않습니다. 전달된 객체가 구식 클래스 (인스턴스가 아닌!)인 경우 해당 객체에는 그러한 속성이 없기 때문입니다.
이것은 일관된 방식으로 그러한 정당한 질문을 만족시키는 내가 생각할 수 있는 가장 작은 코드 스니펫입니다.
#!/usr/bin/env python from types import ClassType #we adopt the null object pattern in the (unlikely) case #that __class__ is None for some strange reason _NO_CLASS=object() def get_object_type(obj): obj_type = getattr(obj, "__class__", _NO_CLASS) if obj_type is not _NO_CLASS: return obj_type # AFAIK the only situation where this happens is an old-style class obj_type = type(obj) if obj_type is not ClassType: raise ValueError("Could not determine object '{}' type.".format(obj_type)) return obj_type
Alan Franzoni
이전 답변과 별도로 오리 타이핑을 보완하는 몇 가지 추상 기본 클래스(ABC)를 포함 collections.abc
의 존재를 언급할 가치가 있습니다.
예를 들어, 다음을 사용하여 목록인지 명시적으로 확인하는 대신:
isinstance(my_obj, list)
가지고 있는 개체가 항목을 가져올 수 있는지 확인하는 데만 관심이 있는 경우 collections.abc.Sequence
사용할 수 있습니다.
from collections.abc import Sequence isinstance(my_obj, Sequence)
항목을 가져오고, 설정하고, 삭제할 수 있는 객체(예: 변경 가능한 시퀀스)에 엄격하게 관심이 있다면 collections.abc.MutableSequence
선택합니다.
다른 많은 상식이있다 정의 Mapping
맵으로 사용할 수 있습니다 객체 Iterable
, Callable
등등. 이 모든 것의 전체 목록은 collections.abc
문서에서 볼 수 있습니다.
Dimitris Fasarakis Hilliard
value = 12 print(type(value)) # will return <class 'int'> (means integer)
또는 다음과 같이 할 수 있습니다.
value = 12 print(type(value) == int) # will return true
Yash Marmat
type()
isinstance()
보다 더 나은 솔루션입니다. 특히 booleans
:
True
와 False
는 파이썬에서 1
과 0
을 의미하는 키워드일 뿐입니다. 따라서,
isinstance(True, int)
그리고
isinstance(False, int)
둘 다 True
반환합니다. 두 부울 모두 정수의 인스턴스입니다. type()
이 더 영리합니다.
type(True) == int
False
반환합니다.
Alec
일반적으로 클래스 이름을 사용하여 객체에서 문자열을 추출할 수 있습니다.
str_class = object.__class__.__name__
비교를 위해 사용하고,
if str_class == 'dict': # blablabla.. elif str_class == 'customclass': # blebleble..
José Crespo Barrios
많은 실제 사례에서 type
또는 isinstance
@functools.singledispatch
를 사용할 수도 있습니다. @functools.singledispatch는 일반 함수 ( 여러 유형에 대해 동일한 작업을 구현하는 여러 함수로 구성된 함수)를 정의하는 데 사용됩니다.
즉, 다음과 같은 코드가 있을 때 사용하고 싶을 것입니다.
def do_something(arg): if isinstance(arg, int): ... # some code specific to processing integers if isinstance(arg, str): ... # some code specific to processing strings if isinstance(arg, list): ... # some code specific to processing lists ... # etc
다음은 작동 방식에 대한 작은 예입니다.
from functools import singledispatch @singledispatch def say_type(arg): raise NotImplementedError(f"I don't work with {type(arg)}") @say_type.register def _(arg: int): print(f"{arg} is an integer") @say_type.register def _(arg: bool): print(f"{arg} is a boolean")
>>> say_type(0) 0 is an integer >>> say_type(False) False is a boolean >>> say_type(dict()) # long error traceback ending with: NotImplementedError: I don't work with <class 'dict'>
또한 추상 클래스 를 사용하여 한 번에 여러 유형을 다룰 수 있습니다.
from collections.abc import Sequence @say_type.register def _(arg: Sequence): print(f"{arg} is a sequence!")
>>> say_type([0, 1, 2]) [0, 1, 2] is a sequence! >>> say_type((1, 2, 3)) (1, 2, 3) is a sequence!
Georgy
완전성을 위해 isinstance 는 인스턴스가 아닌 하위 유형의 유형 검사에 대해 작동하지 않습니다. 그것이 완벽하게 이해되는 동안, 어떤 답변도 (허용된 답변을 포함하여) 그것을 다루지 않습니다. 이를 위해 issubclass 를 사용하십시오.
>>> class a(list): ... pass ... >>> isinstance(a, list) False >>> issubclass(a, list) True
Adnan Y
출처 : http:www.stackoverflow.com/questions/2225038/determine-the-type-of-an-object
'etc. > StackOverFlow' 카테고리의 다른 글
Python 변수의 유형을 결정하는 방법은 무엇입니까? (0) | 2021.12.24 |
---|---|
여러 줄에 걸쳐 YAML의 문자열을 어떻게 나누나요? (0) | 2021.12.24 |
Python virtualenv를 종료/종료/비활성화하는 방법 (0) | 2021.12.24 |
다른 폴더에서 파일 가져오기 (0) | 2021.12.24 |
정적 클래스와 싱글톤 패턴의 차이점은 무엇입니까? (0) | 2021.12.24 |