Bagaimana cara melihat tipe variabel apakah itu unsigned 32 bit, ditandatangani 16 bit, dll?
Bagaimana saya melihatnya?
Bagaimana cara melihat tipe variabel apakah itu unsigned 32 bit, ditandatangani 16 bit, dll?
Bagaimana saya melihatnya?
Jawaban:
Gunakan type()
fungsi bawaan:
>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True
Untuk memeriksa apakah suatu variabel dari tipe yang diberikan, gunakan isinstance
:
>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False
Perhatikan bahwa Python tidak memiliki tipe yang sama dengan C / C ++, yang tampaknya menjadi pertanyaan Anda.
Anda mungkin mencari fungsi bawaan .type()
Lihat contoh di bawah ini, tetapi tidak ada tipe "unsigned" dalam Python seperti Java.
Bilangan bulat positif:
>>> v = 10
>>> type(v)
<type 'int'>
Bilangan bulat positif besar :
>>> v = 100000000000000
>>> type(v)
<type 'long'>
Bilangan bulat negatif:
>>> v = -10
>>> type(v)
<type 'int'>
Urutan karakter literal:
>>> v = 'hi'
>>> type(v)
<type 'str'>
Bilangan bulat titik mengambang:
>>> v = 3.14159
>>> type(v)
<type 'float'>
Bagaimana cara menentukan tipe variabel dalam Python?
Jadi jika Anda memiliki variabel, misalnya:
one = 1
Anda ingin tahu tipenya?
Ada cara yang benar dan cara yang salah untuk melakukan apa saja dengan Python. Inilah cara yang benar:
type
>>> type(one)
<type 'int'>
Anda bisa menggunakan __name__
atribut untuk mendapatkan nama objek. (Ini adalah salah satu dari beberapa atribut khusus yang Anda perlukan untuk menggunakan __dunder__
namanya - bahkan tidak ada metode untuk itu dalam inspect
modul.)
>>> type(one).__name__
'int'
__class__
Dengan Python, nama yang dimulai dengan garis bawah secara semantik bukan bagian dari API publik, dan ini adalah praktik terbaik bagi pengguna untuk menghindari menggunakannya. (Kecuali jika benar-benar diperlukan.)
Karena type
memberi kita kelas objek, kita harus menghindari mendapatkan ini secara langsung. :
>>> one.__class__
Ini biasanya ide pertama yang dimiliki orang ketika mengakses jenis objek dalam suatu metode - mereka sudah mencari atribut, jadi ketik itu terasa aneh. Sebagai contoh:
class Foo(object):
def foo(self):
self.__class__
Jangan. Sebagai gantinya, lakukan ketik (sendiri):
class Foo(object):
def foo(self):
type(self)
Bagaimana cara melihat tipe variabel apakah itu unsigned 32 bit, ditandatangani 16 bit, dll?
Dalam Python, spesifikasi ini adalah detail implementasi. Jadi, secara umum, kita biasanya tidak khawatir tentang ini dengan Python. Namun, untuk memuaskan rasa penasaran Anda ...
Dalam Python 2, int biasanya bilangan bulat yang ditandatangani sama dengan lebar kata implementasi (dibatasi oleh sistem). Ini biasanya diimplementasikan sebagai panjang dalam C . Ketika bilangan bulat menjadi lebih besar dari ini, kami biasanya mengonversinya menjadi Python long (dengan presisi tak terbatas, tidak menjadi bingung dengan C longs).
Sebagai contoh, dalam Python 2 32 bit, kita dapat menyimpulkan bahwa int adalah integer 32 bit yang ditandatangani:
>>> import sys
>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'
Dalam Python 3, int lama hilang, dan kami hanya menggunakan (Python) selama int, yang memiliki ketepatan tak terbatas.
Kami juga dapat memperoleh beberapa informasi tentang pelampung Python, yang biasanya diterapkan sebagai gandaan dalam C:
>>> 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)
Jangan gunakan __class__
, API non-publik yang semantik, untuk mendapatkan jenis variabel. Gunakan type
sebagai gantinya.
Dan jangan terlalu khawatir tentang detail implementasi Python. Saya sendiri tidak harus menangani masalah ini. Anda mungkin juga tidak, dan jika Anda benar-benar melakukannya, Anda harus cukup tahu untuk tidak mencari jawaban ini untuk apa yang harus dilakukan.
<type instance>
tapi __class__
memberi email.message.Message
- apa yang saya lakukan salah?
object
?
import email
tidak menggunakan kelas penemuan saya sendiri.
print type(variable_name)
Saya juga sangat merekomendasikan interpreter interaktif IPython ketika berhadapan dengan pertanyaan seperti ini. Ini memungkinkan Anda mengetik variable_name?
dan akan mengembalikan seluruh daftar informasi tentang objek termasuk jenis dan string dokumen untuk jenis tersebut.
misalnya
In [9]: var = 123
In [10]: var?
Type: int
Base Class: <type 'int'>
String Form: 123
Namespace: Interactive
Docstring:
int(x[, base]) -> integer
Ubah string atau angka menjadi integer, jika memungkinkan. Argumen floating point akan terpotong ke nol (ini tidak termasuk representasi string dari angka floating point!) Saat mengkonversi string, gunakan basis opsional. Merupakan kesalahan untuk memasok basis saat mengonversi non-string. Jika argumen berada di luar rentang integer, sebuah objek panjang akan dikembalikan sebagai gantinya.
print type(str)
mengembalikan kesalahan dalam Python 3.6. Gunakantype(str)
print(type(str))
print type(var)
kode yang salah.
Satu lagi cara menggunakan __class__
:
>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>
Mungkin sedikit tidak relevan. tetapi Anda dapat memeriksa jenis objek dengan isinstance(object, type)
seperti yang disebutkan di sini .
Pertanyaannya agak ambigu - saya tidak yakin apa yang Anda maksud dengan "view". Jika Anda mencoba untuk menanyakan jenis objek Python asli, jawaban @atzz akan mengarahkan Anda ke arah yang benar.
Namun, jika Anda mencoba untuk menghasilkan objek Python yang memiliki semantik tipe-C primitif, (seperti uint32_t
, int16_t
), gunakan struct
modul. Anda dapat menentukan jumlah bit dalam primitif tipe-C yang diberikan dengan demikian:
>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4
Ini juga tercermin dalam array
modul, yang dapat membuat array tipe-tipe tingkat rendah ini:
>>> array.array('c').itemsize # char
1
Bilangan bulat maksimum yang didukung (Python 2 int
) diberikan oleh sys.maxint .
>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0
Ada juga sys.getsizeof , yang mengembalikan ukuran sebenarnya objek Python dalam memori residual:
>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12
Untuk data float dan data presisi, gunakan 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)
Apakah maksud Anda dengan Python atau menggunakan ctypes ?
Dalam kasus pertama, Anda tidak bisa - karena Python tidak menandatangani / unsigned, bilangan bulat 16/32.
Dalam kasus kedua, Anda dapat menggunakan type()
:
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
Untuk referensi lebih lanjut tentang ctypes, jenisnya, lihat dokumentasi resmi .
Python tidak memiliki tipe seperti yang Anda gambarkan. Ada dua jenis yang digunakan untuk mewakili nilai integral:, int
yang sesuai dengan jenis int platform di C, dan long
, yang merupakan integer presisi sewenang-wenang (yaitu tumbuh sesuai kebutuhan dan tidak memiliki batas atas). int
s secara diam-diam dikonversi ke long
jika ekspresi menghasilkan hasil yang tidak dapat disimpanint
.
Itu benar-benar tergantung pada level apa yang Anda maksud. Dalam Python 2.x, ada dua tipe integer, int
(dibatasi ke sys.maxint
) dan long
(presisi tak terbatas), karena alasan historis. Dalam kode Python, ini seharusnya tidak membuat sedikit perbedaan karena juru bahasa secara otomatis mengkonversi menjadi panjang ketika suatu angka terlalu besar. Jika Anda ingin tahu tentang tipe data aktual yang digunakan dalam juru bahasa yang mendasarinya, itu tergantung pada implementasi. (CPython terletak di Objects / intobject.c dan Objects / longobject.c.) Untuk mengetahui tentang tipe sistem lihat jawaban cdleary untuk menggunakan modul struct.
Untuk python2.x, gunakan
print type(variable_name)
Untuk python3.x, gunakan
print(type(variable_name))
Jangan lakukan itu. Meminta tipe sesuatu itu salah. Alih-alih menggunakan polimorfisme. Temukan atau jika perlu tentukan sendiri metode yang melakukan apa yang Anda inginkan untuk semua jenis input yang mungkin dan panggil saja tanpa bertanya tentang apa pun. Jika Anda perlu bekerja dengan tipe bawaan atau tipe yang ditentukan oleh perpustakaan pihak ketiga, Anda selalu dapat mewarisinya dan menggunakan turunan Anda sendiri sebagai gantinya. Atau Anda dapat membungkusnya di dalam kelas Anda sendiri. Ini adalah cara berorientasi objek untuk menyelesaikan masalah seperti itu.
Jika Anda bersikeras untuk memeriksa jenis yang tepat dan menempatkan beberapa kotor if
di sana-sini, Anda dapat menggunakan __class__
properti atau type
fungsi untuk melakukannya, tetapi segera Anda akan menemukan diri Anda memperbarui semua ini if
dengan kasing tambahan setiap dua atau tiga kali komit. Melakukannya dengan cara OO mencegah hal itu dan memungkinkan Anda hanya mendefinisikan kelas baru untuk jenis input baru.