기본적으로 나는 이것을하고 싶다 :
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 () 호출을 실행하기 전에 코드에서 예외가 발생합니다. 인터페이스 검사가 없으면 파일을 제거한 다음 예외가 발생했을 것입니다.