[python] 파이썬에서 객체의 유형을 비교하는 방법은 무엇입니까?

기본적으로 나는 이것을하고 싶다 :

obj = 'str'
type ( obj ) == string

나는 시도했다 :

type ( obj ) == type ( string )

그리고 그것은 작동하지 않았다.

또한 다른 유형은 어떻습니까? 예를 들어, 나는 복제 할 수 없었다 NoneType.



답변

isinstance()

귀하의 경우에는 isinstance("this is a string", str)을 반환 True합니다.

이것을 읽을 수도 있습니다 : http://www.canonical.org/~kragen/isinstance/


답변

isinstance 공장:

if isinstance(obj, MyClass): do_foo(obj)

그러나 , 명심하십시오 : 오리처럼 보이고 오리처럼 들리면 오리입니다.

편집 : 없음 유형의 경우 간단하게 수행 할 수 있습니다.

if obj is None: obj = MyClass()


답변

먼저 모든 유형 비교를 피하십시오. 그것들은 매우, 거의 필요하지 않습니다. 때로는 함수에서 매개 변수 유형을 확인하는 데 도움이됩니다. 잘못된 유형의 데이터는 예외를 발생 시키므로 필요한 모든 것입니다.

모든 기본 변환 함수는 type 함수와 동일하게 매핑됩니다.

type(9) is int
type(2.5) is float
type('x') is str
type(u'x') is unicode
type(2+3j) is complex

다른 경우가 몇 가지 있습니다.

isinstance( 'x', basestring )
isinstance( u'u', basestring )
isinstance( 9, int )
isinstance( 2.5, float )
isinstance( (2+3j), complex )

BTW는 이러한 유형 검사가 필요하지 않습니다. None은 NoneType의 유일한 인스턴스입니다. None 객체는 싱글 톤입니다. 없음을 확인하십시오.

variable is None

BTW, 위의 일반적으로 사용하지 마십시오. 일반적인 예외와 파이썬의 고유 한 다형성을 사용하십시오.


답변

다른 유형의 경우 유형 모듈을 확인하십시오 .

>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True

PS 유형 검사는 나쁜 생각입니다.


답변

알려진 유형의 무언가가 있는 type(x) == type(y)트릭을 항상 사용할 수 있습니다 y.

# check if x is a regular string
type(x) == type('')
# check if x is an integer
type(x) == type(1)
# check if x is a NoneType
type(x) == type(None)

종종 최근의 파이썬에서 더 좋은 방법이 있습니다. 그러나 한 가지만 기억하고 싶다면 기억할 수 있습니다.

이 경우 더 좋은 방법은 다음과 같습니다.

# check if x is a regular string
type(x) == str
# check if x is either a regular string or a unicode string
type(x) in [str, unicode]
# alternatively:
isinstance(x, basestring)
# check if x is an integer
type(x) == int
# check if x is a NoneType
x is None

마지막 경우에 주목하십시오 . NoneType파이썬에는 인스턴스가 하나뿐입니다 None. None 예외를 많이 입력하십시오 (TypeError: 'NoneType' object is unsubscriptable -항상 나에게 발생합니다.)

마지막으로 fengshaun이 지적했듯이 파이썬의 유형 검사는 항상 좋은 생각은 아닙니다. 값을 예상 한 유형처럼 사용하고 그 결과로 발생하는 예외를 포착 (또는 전파)하는 것이 더 비현실적입니다.


답변

당신은 매우 가깝습니다! string유형이 아닌 모듈입니다. obj문자열의 유형 객체와 유형을 비교하려고 할 것입니다 str.

type(obj) == str  # this works because str is already a type

또는

type(obj) == type('')

파이썬 2에서 obj유니 코드 유형 인 경우 위의 어느 것도 작동하지 않습니다. 그렇습니다 isinstance(). 이 문제를 해결하는 방법은이 게시물에 대한 John의 의견을 참조하십시오. 지금 10 분 정도 기억하려고했지만 메모리 블록이있었습니다!


답변

당신이 작성해야하기 때문입니다

s="hello"
type(s) == type("")

type은 인스턴스를 허용하고 해당 유형을 반환합니다. 이 경우 두 인스턴스 유형을 비교해야합니다.

사전 점검을 수행해야하는 경우 유형보다 지원되는 인터페이스를 점검하는 것이 좋습니다.

동일한 인터페이스를 구현하기 때문에 완전히 다른 유형의 완전히 다른 인스턴스를 가질 수 있다는 사실에 관계없이 코드는 특정 유형의 인스턴스를 원한다는 사실을 제외하고는 실제로 유형을 많이 알려주지 않습니다. .

예를 들어이 코드가 있다고 가정합니다.

def firstElement(parameter):
    return parameter[0]

자,이 코드가 튜플 만 허용하기를 원한다고 가정하십시오.

import types

def firstElement(parameter):
    if type(parameter) != types.TupleType:
         raise TypeError("function accepts only a tuple")
    return parameter[0]

이것은이 루틴의 재사용 성을 감소시킵니다. 목록, 문자열 또는 numpy.array를 전달하면 작동하지 않습니다. 더 나은 것

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    return parameter[0]

프로토콜이 만족스럽지 않으면 parameter [0]에서 예외가 발생합니다. 물론 부작용을 방지하거나 실패하기 전에 호출 할 수있는 호출을 복구하지 않는 한이 방법은 예외입니다. (견고한) 예, 요점을 지적하십시오.

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    os.system("rm file")
    return parameter[0]

이 경우 system () 호출을 실행하기 전에 코드에서 예외가 발생합니다. 인터페이스 검사가 없으면 파일을 제거한 다음 예외가 발생했을 것입니다.