부호없는 32 비트, 부호있는 16 비트 등 변수 유형을 어떻게 확인합니까?
어떻게 보나요?
부호없는 32 비트, 부호있는 16 비트 등 변수 유형을 어떻게 확인합니까?
어떻게 보나요?
답변:
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 ++와 같은 타입을 가지고 있지 않습니다.
내장 기능을 찾고있을 수 있습니다 .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'>
파이썬에서 변수 유형을 결정하는 방법은 무엇입니까?
예를 들어 변수가 있다면
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)
부호없는 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
-내가 뭘 잘못하고 있습니까?
object
않습니까?
import email
내 자신의 발명품을 사용 하지 않습니다.
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쪽으로 잘립니다 (부동 소수점 숫자의 문자열 표현은 포함되지 않습니다!) 문자열을 변환 할 때 선택적인 밑을 사용하십시오. 문자열이 아닌 것을 변환 할 때베이스를 제공하는 것은 오류입니다. 인수가 정수 범위를 벗어나면 대신 긴 오브젝트가 리턴됩니다.
print type(str)
Python 3.6에서 오류를 반환합니다. 사용type(str)
print(type(str))
print type(var)
잘못된 코드를 수정해야 합니다.
사용하는 또 다른 방법 __class__
:
>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>
질문은 다소 모호합니다. "보기"의 의미가 무엇인지 잘 모르겠습니다. 네이티브 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)
당신이에 의미합니까 파이썬 또는 사용 하는 ctypes를 ?
첫 번째 경우, 파이썬에는 부호없는 / 부호없는 16/32 비트 정수가 없기 때문에 단순히 할 수 없습니다.
두 번째 경우에는 다음을 사용할 수 있습니다 type()
.
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
유형 인 ctype에 대한 자세한 내용 은 공식 문서를 참조하십시오 .
그것은 실제로 당신이 의미하는 수준에 달려 있습니다. Python 2.x에는 역사적 이유로 두 개의 정수 유형 int
(으로 제한됨 sys.maxint
)과 long
(무제한 정밀도)이 있습니다. 파이썬 코드에서는 숫자가 너무 클 때 인터프리터가 자동으로 long으로 변환하기 때문에 약간의 차이가 없어야합니다. 기본 인터프리터에 사용되는 실제 데이터 유형에 대해 알고 싶다면 구현에 따라 다릅니다. CPython은 Objects / intobject.c 및 Objects / longobject.c에 있습니다. 시스템 유형을 찾으려면 struct 모듈 사용에 대한 cdleary answer를보십시오.
하지 마십시오. 무언가를 요구하는 것은 그 자체로 잘못되었습니다. 대신 다형성을 사용하십시오. 가능한 입력 유형에 대해 원하는 작업을 수행하는 메소드를 찾거나 필요한 경우 아무 것도 묻지 않고 호출하십시오. 타사 라이브러리에 의해 정의 된 내장 유형 또는 유형으로 작업해야하는 경우 항상 해당 유형을 상속하고 대신 자체 파생 상품을 사용할 수 있습니다. 또는 당신은 당신의 자신의 클래스 안에 그들을 감쌀 수 있습니다. 이러한 문제를 해결하기위한 객체 지향 방법입니다.
정확한 유형을 확인하고 더러운 것을 if
여기 저기에 배치해야한다고 주장 하면 __class__
속성이나 type
함수를 사용 하여 수행 할 수 있지만 곧 if
2 ~ 3 개의 커밋마다 추가 사례 로이 모든 것을 업데이트 할 수 있습니다. OO 방식으로 수행하면이를 방지하고 대신 새로운 유형의 입력에 대한 새 클래스 만 정의 할 수 있습니다.