Saya harus menggandakan mengambil ketika saya melihat ini. Java SE8 sekarang mengandung bilangan bulat yang tidak ditandatangani, dan saya telah mengembangkan begitu banyak dengannya sehingga tampak berdosa bahwa Java tidak pernah memiliki bilangan bulat yang tidak ditandatangani sebelum SE8.
dddJewelsbbb
172
Ini sangat sederhana. Anda melakukannya seperti ini.
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:
Menggunakan 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 inspectmodul.)
>>> type(one).__name__
'int'
Jangan gunakan __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 typememberi 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:
classFoo(object):def foo(self):
self.__class__
Jangan. Sebagai gantinya, lakukan ketik (sendiri):
classFoo(object):def foo(self):
type(self)
Detail implementasi int dan float
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:
Jangan gunakan __class__, API non-publik yang semantik, untuk mendapatkan jenis variabel. Gunakan typesebagai 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.
ketik keluar <type instance>tapi __class__memberi email.message.Message- apa yang saya lakukan salah?
Jasen
@ Yasen Apakah Anda menggunakan Python 2 dan tidak mewarisi dari object?
Aaron Hall
ya, import email tidak menggunakan kelas penemuan saya sendiri.
Jasen
65
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 =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
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.
re: komentar "nama yang dimulai dengan garis bawah ..." (tunggal) garis bawah sangat berbeda dari garis bawah ganda ("dunders") dan mereka jelas merupakan bagian dari API publik dan tentu saja boleh digunakan. Ini mungkin bisa membantu ... youtu.be/wf-BqAjZb8M
michael
31
Contoh pemeriksaan tipe sederhana dengan Python:
assert type(variable_name)== int
assert type(variable_name)== bool
assert type(variable_name)== list
Saya pikir ini jauh lebih baik daripada tipe fungsi untuk digunakan dalam proses pemeriksaan. Jika Anda ingin memeriksa dan bertindak dengan hasil yang harus Anda gunakan coba tangkap dengan tipe tetapi isinstance mengembalikan benar atau salah
alkanschtein
24
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 structmodul. Anda dapat menentukan jumlah bit dalam primitif tipe-C yang diberikan dengan demikian:
Pertanyaannya, seperti yang saya mengerti, menanyakan tentang menanyakan tipe "variabel" dengan Python. Jawaban Anda umumnya benar tetapi di luar topik.
tzot
19
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:, intyang sesuai dengan jenis int platform di C, dan long, yang merupakan integer presisi sewenang-wenang (yaitu tumbuh sesuai kebutuhan dan tidak memiliki batas atas). ints secara diam-diam dikonversi ke longjika 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.
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 ifdi sana-sini, Anda dapat menggunakan __class__properti atau typefungsi untuk melakukannya, tetapi segera Anda akan menemukan diri Anda memperbarui semua ini ifdengan 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.
Jawaban:
Gunakan
type()
fungsi bawaan:Untuk memeriksa apakah suatu variabel dari tipe yang diberikan, gunakan
isinstance
:Perhatikan bahwa Python tidak memiliki tipe yang sama dengan C / C ++, yang tampaknya menjadi pertanyaan Anda.
sumber
Anda mungkin mencari fungsi bawaan .
type()
Lihat contoh di bawah ini, tetapi tidak ada tipe "unsigned" dalam Python seperti Java.
Bilangan bulat positif:
Bilangan bulat positif besar :
Bilangan bulat negatif:
Urutan karakter literal:
Bilangan bulat titik mengambang:
sumber
Ini sangat sederhana. Anda melakukannya seperti ini.
sumber
Jadi jika Anda memiliki variabel, misalnya:
Anda ingin tahu tipenya?
Ada cara yang benar dan cara yang salah untuk melakukan apa saja dengan Python. Inilah cara yang benar:
Menggunakan
type
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 dalaminspect
modul.)Jangan gunakan
__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. :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:
Jangan. Sebagai gantinya, lakukan ketik (sendiri):
Detail implementasi int dan float
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:
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:
Kesimpulan
Jangan gunakan
__class__
, API non-publik yang semantik, untuk mendapatkan jenis variabel. Gunakantype
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.
sumber
<type instance>
tapi__class__
memberiemail.message.Message
- apa yang saya lakukan salah?object
?import email
tidak menggunakan kelas penemuan saya sendiri.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
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.
sumber
print type(str)
mengembalikan kesalahan dalam Python 3.6. Gunakantype(str)
print(type(str))
print type(var)
kode yang salah.sumber
Satu lagi cara menggunakan
__class__
:sumber
Contoh pemeriksaan tipe sederhana dengan Python:
sumber
Mungkin sedikit tidak relevan. tetapi Anda dapat memeriksa jenis objek dengan
isinstance(object, type)
seperti yang disebutkan di sini .sumber
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
), gunakanstruct
modul. Anda dapat menentukan jumlah bit dalam primitif tipe-C yang diberikan dengan demikian:Ini juga tercermin dalam
array
modul, yang dapat membuat array tipe-tipe tingkat rendah ini:Bilangan bulat maksimum yang didukung (Python 2
int
) diberikan oleh sys.maxint .Ada juga sys.getsizeof , yang mengembalikan ukuran sebenarnya objek Python dalam memori residual:
Untuk data float dan data presisi, gunakan sys.float_info :
sumber
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()
:Untuk referensi lebih lanjut tentang ctypes, jenisnya, lihat dokumentasi resmi .
sumber
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, danlong
, yang merupakan integer presisi sewenang-wenang (yaitu tumbuh sesuai kebutuhan dan tidak memiliki batas atas).int
s secara diam-diam dikonversi kelong
jika ekspresi menghasilkan hasil yang tidak dapat disimpanint
.sumber
Sederhana, untuk python 3.4 ke atas
Python 2.7 dan di atasnya
sumber
Itu benar-benar tergantung pada level apa yang Anda maksud. Dalam Python 2.x, ada dua tipe integer,
int
(dibatasi kesys.maxint
) danlong
(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.sumber
Untuk python2.x, gunakan
Untuk python3.x, gunakan
sumber
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 atautype
fungsi untuk melakukannya, tetapi segera Anda akan menemukan diri Anda memperbarui semua iniif
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.sumber