Bagaimana cara menentukan tipe variabel Python?


Jawaban:


1380

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.


437

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'>

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.

print(type(variable_name))

110

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:

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

Jangan. Sebagai gantinya, lakukan ketik (sendiri):

class Foo(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:

>>> 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)

Kesimpulan

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 = 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.


2
Saya meminta unsigned int, signed int etc
user46646

3
print type(str)mengembalikan kesalahan dalam Python 3.6. Gunakantype(str)
Kolob Canyon

4
@KolobCanyon itu karena dalam 3.x, cetak membutuhkan kurung:print(type(str))
jcoppens

1
Anda harus benar-benar mengubah print type(var)kode yang salah.
Han 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

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'>

1
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

29

Mungkin sedikit tidak relevan. tetapi Anda dapat memeriksa jenis objek dengan isinstance(object, type)seperti yang disebutkan di sini .


1
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:

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

Ini juga tercermin dalam arraymodul, 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)

7
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 .


15

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 .


11

Sederhana, untuk python 3.4 ke atas

print (type(variable_name))

Python 2.7 dan di atasnya

print type(variable_name)

10

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.


7

Untuk python2.x, gunakan

print type(variable_name)

Untuk python3.x, gunakan

print(type(variable_name))

-29

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.


4
Saya tidak benar-benar tahu apa jawaban ini ditambahkan ke yang sudah ada (di luar kalimat pertama mungkin?)
user2305193
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.