파이썬 변수의 유형을 결정하는 방법?


답변:


1379

type()내장 함수를 사용하십시오 .

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

변수가 주어진 유형인지 확인하려면 다음을 사용하십시오 isinstance.

>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False

파이썬은 C / C ++와 같은 타입을 가지고 있지 않습니다.


437

내장 기능을 찾고있을 수 있습니다 .type()

아래 예제를 참조하십시오. 그러나 Java와 마찬가지로 Python에는 "서명되지 않은"유형이 없습니다.

양의 정수:

>>> v = 10
>>> type(v)
<type 'int'>

양의 정수 :

>>> v = 100000000000000
>>> type(v)
<type 'long'>

음의 정수 :

>>> v = -10
>>> type(v)
<type 'int'>

문자의 문자 순서 :

>>> v = 'hi'
>>> type(v)
<type 'str'>

부동 소수점 정수 :

>>> v = 3.14159
>>> type(v)
<type 'float'>

이걸 보았을 때 두 번 가져 가야했습니다. Java SE8에는 이제 부호없는 정수가 포함되어 있으며 Java로 SE8 이전에는 부호없는 정수가 없었기 때문에 죄로 보입니다.
dddJewelsbbb

171

너무 간단합니다. 당신은 이것을 이렇게합니다.

print(type(variable_name))

110

파이썬에서 변수 유형을 결정하는 방법은 무엇입니까?

예를 들어 변수가 있다면

one = 1

그 유형을 알고 싶습니까?

파이썬에서 모든 것에 대해 올바른 방법과 잘못된 방법이 있습니다. 올바른 방법은 다음과 같습니다.

사용하다 type

>>> type(one)
<type 'int'>

__name__속성을 사용 하여 객체의 이름을 얻을 수 있습니다 . (이것은 __dunder__이름을 얻는 데 필요한 몇 가지 특수 속성 중 하나입니다 - inspect모듈 에는 그 방법이 없습니다 .)

>>> type(one).__name__
'int'

사용하지 마십시오 __class__

파이썬에서 밑줄로 시작하는 이름은 의미 상 공개 API의 일부가 아니며 사용자가 사용하지 않는 것이 가장 좋습니다. (필요한 경우 제외)

type우리에게 객체의 클래스를 제공하기 때문에 우리는 이것을 직접 얻지 않아야합니다. :

>>> one.__class__

이것은 일반적으로 사람들이 메소드에서 객체의 유형에 액세스 할 때 가장 먼저 생각하는 것입니다. 이미 속성을 찾고 있으므로 유형이 이상하게 보입니다. 예를 들면 다음과 같습니다.

class Foo(object):
    def foo(self):
        self.__class__

하지마 대신, (self)를 입력하십시오 :

class Foo(object):
    def foo(self):
        type(self)

int 및 float의 구현 세부 사항

부호없는 32 비트, 부호있는 16 비트 등 변수 유형을 어떻게 확인합니까?

파이썬에서 이러한 세부 사항은 구현 세부 사항입니다. 따라서 일반적으로 파이썬에서는 이에 대해 걱정하지 않습니다. 그러나 호기심을 없애기 위해 ...

Python 2에서 int는 일반적으로 구현의 단어 너비 (시스템에 의해 제한됨) 와 동일한 부호있는 정수 입니다. 일반적으로 C길게 구현됩니다 . 정수가 이보다 커지면 일반적으로 정수로 파이썬 long으로 변환합니다 (C long과 혼동하지 않도록 무제한 정밀도로).

예를 들어, 32 비트 Python 2에서 int가 부호있는 32 비트 정수라고 추론 할 수 있습니다.

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

파이썬 3에서는 오래된 int가 사라지고 무한 정밀도 를 가진 int만큼 (Python 's)을 사용 합니다.

파이썬의 float에 관한 정보도 얻을 수 있는데, 일반적으로 C 에서 double 로 구현됩니다 .

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

결론

__class__의미 상 비공개 API 인을 사용하여 변수 유형을 가져 오지 마십시오 . type대신 사용하십시오 .

그리고 파이썬의 구현 세부 사항에 대해 너무 걱정하지 마십시오. 나는이 문제를 해결할 필요가 없었습니다. 당신은 아마하지 않을 것입니다, 당신이 정말로한다면, 당신은 무엇을 해야하는지에 대한 대답을 찾지 않을만큼 충분히 알아야합니다.


유형은 나와 <type instance>있지만 __class__제공됩니다 email.message.Message-내가 뭘 잘못하고 있습니까?
Jasen

@Jasen Python 2를 사용하고 있으며 상속하지 object않습니까?
Aaron Hall

예, 단지 import email 내 자신의 발명품을 사용 하지 않습니다.
Jasen

65
print type(variable_name)

나는 이와 같은 질문을 다룰 때 IPython 대화 형 통역사를 강력히 추천합니다 . 형식을 사용하면 형식 variable_name?및 형식에 대한 문서 문자열을 포함하여 개체에 대한 전체 정보 목록을 반환합니다.

예 :

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

가능하면 문자열 또는 숫자를 정수로 변환하십시오. 부동 소수점 인수는 0쪽으로 잘립니다 (부동 소수점 숫자의 문자열 표현은 포함되지 않습니다!) 문자열을 변환 할 때 선택적인 밑을 사용하십시오. 문자열이 아닌 것을 변환 할 때베이스를 제공하는 것은 오류입니다. 인수가 정수 범위를 벗어나면 대신 긴 오브젝트가 리턴됩니다.


2
나는 서명, 서명되지 않은 인터넷 용 INT 등 요청
user46646을

3
print type(str)Python 3.6에서 오류를 반환합니다. 사용type(str)
Kolob Canyon

4
@KolobCanyon 3.x에서 인쇄는 괄호가 필요하기 때문입니다.print(type(str))
jcoppens

1
실제로 print type(var)잘못된 코드를 수정해야 합니다.
한 XIAO

54
a = "cool"
type(a)

//result 'str'
<class 'str'>
or 
do 
`dir(a)` 
to see the list of inbuilt methods you can have on the variable.

40

사용하는 또 다른 방법 __class__:

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

1
re : comment "밑줄로 시작하는 이름 ..." (단일) 밑줄은 이중 밑줄 ( "dunders")과는 매우 다르며 반드시 공개 API의 일부이므로 확실히 사용하는 것이 좋습니다. 도움이 될 수도 있습니다 ... youtu.be/wf-BqAjZb8M
michael

31

파이썬에서 간단한 유형 검사의 예 :

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

거의 관련이 없을 수 있습니다. 그러나 여기에isinstance(object, type) 언급 된 것처럼 객체 유형을 확인할 수 있습니다 .


1
나는 이것이 프로세스 검사에서 사용하는 유형 함수보다 낫다고 생각합니다. 당신이 확인하고 그 결과 행동 할 경우에 당신은 유형 만 isinstance 반환 참 또는 거짓으로 시도 캐치를 사용해야합니다
alkanschtein

24

질문은 다소 모호합니다. "보기"의 ​​의미가 무엇인지 잘 모르겠습니다. 네이티브 Python 객체의 유형 을 쿼리 하려고하면 @atzz 의 답변이 올바른 방향으로 안내합니다.

당신이하려고하는 경우, 생성 (예 : 원시 C-유형의 의미를 가지고 파이썬 객체를 uint32_t, int16_t)를 사용하는 struct모듈. 주어진 C- 타입 프리미티브의 비트 수를 다음과 같이 결정할 수 있습니다.

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

이것은 또한 array모듈에 반영되어 다음과 같은 하위 레벨 유형의 배열을 만들 수 있습니다.

>>> array.array('c').itemsize # char
1

지원되는 최대 정수 (Python 2 's int)는 sys.maxint에 의해 제공됩니다 .

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

sys.getsizeof 도 있습니다.이 함수는 잔여 메모리에 파이썬 객체 의 실제 크기를 반환합니다 .

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

부동 데이터 및 정밀 데이터의 경우 sys.float_info를 사용 하십시오 .

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

7
내가 이해하는 것처럼 질문은 파이썬에서 "변수"의 유형을 쿼리하는 것에 대해 묻습니다. 귀하의 답변은 일반적으로 정확하지만 주제를 벗어납니다.
tzot

19

당신이에 의미합니까 파이썬 또는 사용 하는 ctypes를 ?

첫 번째 경우, 파이썬에는 부호없는 / 부호없는 16/32 비트 정수가 없기 때문에 단순히 할 수 없습니다.

두 번째 경우에는 다음을 사용할 수 있습니다 type().

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

유형 인 ctype에 대한 자세한 내용 은 공식 문서를 참조하십시오 .


15

파이썬에는 당신이 묘사 한 타입이 없습니다. 적분 값을 나타내는 데 사용되는 두 가지 유형이 있습니다. int, C의 플랫폼 int 유형에 해당하고 long, 임의 정밀도 정수입니다 (즉, 필요에 따라 증가하고 상한이 없음). 식이에 저장할 수없는 결과를 생성하면 ints는 자동으로 변환됩니다 .longint


11

파이썬 3.4 이상에서는 간단합니다.

print (type(variable_name))

파이썬 2.7 이상

print type(variable_name)

10

그것은 실제로 당신이 의미하는 수준에 달려 있습니다. Python 2.x에는 역사적 이유로 두 개의 정수 유형 int(으로 제한됨 sys.maxint)과 long(무제한 정밀도)이 있습니다. 파이썬 코드에서는 숫자가 너무 클 때 인터프리터가 자동으로 long으로 변환하기 때문에 약간의 차이가 없어야합니다. 기본 인터프리터에 사용되는 실제 데이터 유형에 대해 알고 싶다면 구현에 따라 다릅니다. CPython은 Objects / intobject.c 및 Objects / longobject.c에 있습니다. 시스템 유형을 찾으려면 struct 모듈 사용에 대한 cdleary answer를보십시오.


7

python2.x의 경우

print type(variable_name)

python3.x의 경우

print(type(variable_name))

-29

하지 마십시오. 무언가를 요구하는 것은 그 자체로 잘못되었습니다. 대신 다형성을 사용하십시오. 가능한 입력 유형에 대해 원하는 작업을 수행하는 메소드를 찾거나 필요한 경우 아무 것도 묻지 않고 호출하십시오. 타사 라이브러리에 의해 정의 된 내장 유형 또는 유형으로 작업해야하는 경우 항상 해당 유형을 상속하고 대신 자체 파생 상품을 사용할 수 있습니다. 또는 당신은 당신의 자신의 클래스 안에 그들을 감쌀 수 있습니다. 이러한 문제를 해결하기위한 객체 지향 방법입니다.

정확한 유형을 확인하고 더러운 것을 if여기 저기에 배치해야한다고 주장 하면 __class__속성이나 type함수를 사용 하여 수행 할 수 있지만 곧 if2 ~ 3 개의 커밋마다 추가 사례 로이 모든 것을 업데이트 할 수 있습니다. OO 방식으로 수행하면이를 방지하고 대신 새로운 유형의 입력에 대한 새 클래스 만 정의 할 수 있습니다.


4
이 답변이 기존 답변에 추가 된 내용을 모르겠습니다 (첫 번째 문장을 넘어서?)
user2305193
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.