Pertanyaan Bagaimana cara menentukan jenis variabel Python?


Bagaimana saya melihat jenis variabel apakah itu unsigned 32 bit, ditandatangani 16 bit, dll?

Bagaimana saya melihatnya?


1031
2017-12-31 07:58


asal


Jawaban:


Python tidak memiliki tipe yang sama dengan C / C ++, yang tampaknya merupakan pertanyaan Anda.

Coba ini:

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

Perbedaan antara int dan lama hilang dalam Python 3.0, meskipun.


948
2017-12-31 10:43



Anda mungkin mencari type() fungsi.

Lihat contoh di bawah ini, tetapi tidak ada tipe "unsigned" di Python seperti Java.

Bilangan bulat positif:

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

Besar bilangan bulat positif:

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

Bilangan bulat negatif:

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

Urutan karakter secara harfiah:

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

Bilangan bulat floating point:

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

306
2017-10-01 11:02



Ini sangat sederhana. Anda melakukannya seperti ini.

print(type(variable_name))

133
2017-10-07 16:02



Bagaimana cara menentukan jenis variabel dengan Python?

Jadi, jika Anda memiliki variabel, misalnya:

one = 1

Anda ingin tahu tipenya?

Ada cara yang benar dan cara yang salah untuk melakukan segala sesuatu dengan Python. Inilah cara yang benar:

Menggunakan type

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

Anda dapat menggunakan __name__ atribut untuk mendapatkan nama objek. (Ini adalah salah satu dari beberapa atribut khusus yang perlu Anda gunakan __dunder__ nama untuk mendapatkan - bahkan tidak ada metode untuk itu di inspect modul.)

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

Jangan gunakan __class__

Dengan Python, nama yang dimulai dengan garis bawah secara semantis bukan bagian dari API publik, dan ini merupakan praktik terbaik bagi pengguna untuk menghindari penggunaannya. (Kecuali ketika benar-benar diperlukan.)

Sejak type memberi kita kelas objek, kita harus menghindari hal ini secara langsung. :

>>> one.__class__

Ini biasanya adalah ide pertama yang dimiliki orang ketika mengakses jenis objek dalam suatu metode - mereka sudah mencari atribut, sehingga tipe tampaknya aneh. Sebagai contoh:

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

Jangan. Sebaliknya, lakukan tipe (diri):

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

Detail penerapan int dan float

Bagaimana saya melihat jenis variabel apakah itu unsigned 32 bit, ditandatangani 16 bit, dll?

Dalam Python, spesifikasi ini adalah detail implementasi. Jadi, secara umum, kami biasanya tidak mengkhawatirkan hal ini dengan Python. Namun, untuk memuaskan rasa ingin tahu Anda ...

Dalam Python 2, int biasanya integer yang ditandatangani sama dengan implementasi kata lebar (dibatasi oleh sistem). Biasanya diimplementasikan sebagai panjang di C. Ketika bilangan bulat menjadi lebih besar dari ini, kami biasanya mengonversinya menjadi longsoran Python (dengan presisi yang tidak terbatas, tidak menjadi bingung dengan C longs).

Sebagai contoh, dalam 32 bit Python 2, kita dapat menyimpulkan bahwa int adalah bilangan integer 32 bertanda:

>>> import sys

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

Pada Python 3, int yang lama hilang, dan kita hanya menggunakan (Python) selama int, yang memiliki ketepatan tak terbatas.

Kami juga bisa mendapatkan beberapa informasi tentang pelampung Python, yang biasanya diimplementasikan sebagai dua kali lipat di 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 semantis nonpublik, untuk mendapatkan jenis variabel. Menggunakan type sebagai gantinya.

Dan jangan terlalu khawatir tentang detail penerapan Python. Saya tidak harus berurusan dengan masalah seputar ini sendiri. Anda mungkin tidak akan melakukannya, dan jika Anda benar-benar melakukannya, Anda harus cukup tahu untuk tidak mencari jawaban ini untuk apa yang harus dilakukan.


77
2018-03-18 02:48



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

36
2017-12-31 08:08



Pertanyaannya agak ambigu - saya tidak yakin apa yang Anda maksud dengan "tampilan". Jika Anda mencoba pertanyaan jenis objek Python asli, @atzzJawabannya akan mengarahkan Anda ke arah yang benar.

Namun, jika Anda mencoba menghasilkan Benda Python yang memiliki semantik C-tipe primitif, (seperti uint32_t, int16_t), menggunakan struct modul. Anda dapat menentukan jumlah bit dalam tipe C primitif 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 dari jenis tingkat yang lebih rendah ini:

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

Bilangan bulat maksimum yang didukung (Python 2's 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 dari Python objek dalam memori sisa:

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

25
2017-12-31 08:02



print type(variable_name)

Saya juga sangat merekomendasikan IPython interpreter interaktif 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 jenisnya.

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 ke integer, jika memungkinkan. Argumen titik apung akan dipotong ke nol (ini tidak termasuk string representasi angka titik apung!) Saat mengonversi string, gunakan basis opsional. Ini adalah kesalahan untuk menyediakan basis ketika mengonversi a         non-string. Jika argumen berada di luar rentang integer, sebuah objek panjang         akan dikembalikan sebagai gantinya.


20
2017-08-14 06:39