Python değişkeninin tipi nasıl belirlenir?


Yanıtlar:


1380

type()Yerleşik işlevi kullanın :

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

Bir değişkenin belirli bir türde olup olmadığını kontrol etmek için şunu kullanın isinstance:

>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False

Python'un sorunuz gibi görünen C / C ++ ile aynı tiplere sahip olmadığını unutmayın.


437

Yerleşik işlevi arıyor olabilirsiniz .type()

Aşağıdaki örneklere bakın, ancak Python'da tıpkı Java gibi "imzasız" bir tür yoktur.

Pozitif tamsayı:

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

Büyük pozitif tamsayı:

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

Negatif tamsayı:

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

Değişmez karakter sırası:

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

Kayan nokta tamsayısı:

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

Bunu görünce iki kere almak zorunda kaldım. Java SE8 artık imzasız tamsayılar içeriyor ve onunla o kadar çok geliştim ki, Java'nın SE8'den önce hiç imzasız tamsayılara sahip olmadığı günahkar görünüyor.
dddJewelsbbb

172

Çok basit. Sen böyle yap.

print(type(variable_name))

110

Python'da değişken türü nasıl belirlenir?

Bir değişkeniniz varsa, örneğin:

one = 1

Türünü bilmek ister misin?

Python'da hemen her şeyi yapmanın doğru yolları ve yanlış yolları var. İşte doğru yol:

kullanım type

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

__name__Nesnenin adını almak için özniteliği kullanabilirsiniz . (Bu, __dunder__erişmek için adı kullanmanız gereken birkaç özel özellikten biridir - inspectmodülde bunun için bir yöntem bile yoktur .)

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

Kullanma __class__

Python'da alt çizgilerle başlayan adlar anlamsal olarak genel API'nın bir parçası değildir ve kullanıcıların bunları kullanmaktan kaçınmaları için en iyi uygulamadır. (Kesinlikle gerekli olduğu durumlar hariç.)

Yana typebize nesnenin sınıfını verir, doğrudan bu almamak gerekir. :

>>> one.__class__

Bu genellikle insanların bir yöntemdeki bir nesnenin türüne erişirken sahip oldukları ilk fikirdir - zaten öznitelikleri arıyorlar, bu yüzden tür garip görünüyor. Örneğin:

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

Yapma. Bunun yerine şunu yazın (self):

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

Ints ve float uygulama detayları

İşaretsiz 32 bit, imzalı 16 bit vb. Bir değişkenin türünü nasıl görebilirim?

Python'da bu özellikler uygulama detaylarıdır. Genel olarak Python'da bunun için endişelenmiyoruz. Ancak, merakınızı doyurmak için ...

Python 2'de int genellikle uygulamanın kelime genişliğine eşit olan işaretli bir tamsayıdır (sistem tarafından sınırlandırılır). Genellikle C olarak uzun bir süre uygulanır . Tamsayılar bundan daha büyük olduğunda, genellikle bunları Python uzunluğuna dönüştürürüz (sınırsız hassasiyetle, C uzunluğuyla karıştırılmamalıdır).

Örneğin, 32 bit Python 2'de int'in işaretli bir 32 bit tam sayı olduğunu belirleyebiliriz:

>>> import sys

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

Python 3'te eski int ortadan kaybolur ve sınırsız hassasiyete sahip olan int kadar uzun süre (Python) kullanırız .

Ayrıca, genellikle C'de çift olarak uygulanan Python'un şamandıraları hakkında bilgi edinebiliriz :

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

Sonuç

__class__Bir değişkenin türünü almak için anlamsal olarak herkese açık olmayan bir API kullanmayın . typeBunun yerine kullanın .

Ve Python'un uygulama detayları hakkında çok fazla endişelenmeyin. Bunun etrafındaki sorunlarla başa çıkmak zorunda kalmadım. Muhtemelen de yapmayacaksınız ve gerçekten yaparsanız, ne yapacağınız için bu cevaba bakmamaya yetecek kadar bilgi sahibi olmalısınız.


türü olarak çıkıyor <type instance>ama __class__veriyor email.message.Message- ben neyi yanlış yapıyorum?
Jasen

@Jasen Python 2 mi kullanıyorsunuz ve miras almıyor musunuz object?
Aaron Hall

evet, sadece import email kendi buluşumun hiçbir sınıfını kullanmıyorum .
Jasen

65
print type(variable_name)

Bunun gibi sorularla uğraşırken IPython interaktif tercümanı da şiddetle tavsiye ederim . Yazmanıza izin verir variable_name?ve tür ve tür için doc dizesi de dahil olmak üzere nesne hakkında bir bilgi listesi döndürür.

Örneğin

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

Mümkünse, bir dize veya sayıyı tamsayıya dönüştürün. Kayan nokta bağımsız değişkeni sıfıra doğru kısaltılacaktır (bu, kayan nokta numarasının dize olarak temsil edilmesini içermez!) Bir dizeyi dönüştürürken, isteğe bağlı tabanı kullanın. Dizesi olmayan bir dönüştürürken bir taban sağlamak bir hatadır. Argüman tamsayı aralığının dışındaysa, bunun yerine uzun bir nesne döndürülür.


2
İmzasız int, imzalı int vb.
İstedim

3
print type(str)Python 3.6'da bir hata döndürür. Kullanımtype(str)
Kolob Kanyonu

4
@KolobCanyon 3.x, baskı parantez gerekiyor çünkü:print(type(str))
jcoppens

1
print type(var)Hatalı kodu gerçekten değiştirmelisiniz .
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

Kullanmanın bir yolu daha __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: comment " alt çizgilerle başlayan isimler ..." (tek) alt çizgiler, çift alt çizgilerden ("dunders") çok farklıdır ve kesinlikle herkese açık API'nın bir parçasıdır ve bunları kullanmak kesinlikle iyidir. Bu yardımcı olabilir ... youtu.be/wf-BqAjZb8M
michael

31

Python'da basit tip denetimi örnekleri:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

Biraz alakasız olabilir. ancak buradaisinstance(object, type) belirtildiği şekilde bir nesne türünü kontrol edebilirsiniz .


1
Bence bu, kontrol sürecinde kullanılacak tip fonksiyonundan çok daha iyi.
Sonucu

24

Soru biraz belirsiz - "bakış" ile ne demek istediğinden emin değilim. Yerel bir Python nesnesinin türünü sorgulamaya çalışıyorsanız , @atzz'ın yanıtı sizi doğru yönde yönlendirecektir.

Eğer çalışıyorsanız, ancak oluşturmak (örneğin, temel C-tipleri, anlamlara sahip Python nesneleri uint32_t, int16_t) kullanımı structmodülü. Belirli bir C tipi ilkeldeki bit sayısını böylece belirleyebilirsiniz:

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

Bu, arrayaşağıdaki alt düzey türlerin dizilerini oluşturabilen modüle de yansır :

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

Desteklenen maksimum tam sayı (Python 2 int) sys.maxint tarafından verilir .

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

Ayrıca, artık bellekte Python nesnesinin gerçek boyutunu döndüren sys.getsizeof vardır :

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

Kayan noktalı veri ve hassas veriler için sys.float_info kullanın :

>>> 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
Anladığım kadarıyla soru, Python'da bir "değişken" türünü sorgulamayı soruyor. Cevabınız genellikle doğru ancak konu dışı.
tzot

19

Python'da mı yoksa ctypes mi kullanıyorsunuz ?

İlk durumda, yapamazsınız - çünkü Python'un imzalı / imzasız, 16/32 bit tamsayıları yoktur.

İkinci durumda şunları kullanabilirsiniz type():

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

Bir türü olan ctypes hakkında daha fazla bilgi için resmi belgelere bakın .


15

Python'un açıkladığınız gibi türleri yok. İntegral değerleri temsil etmek için kullanılan iki tip vardır: intplatformun C longcinsinden int tipine karşılık gelen ve keyfi bir hassasiyet tamsayısıdır (yani gerektiğinde büyür ve bir üst limiti yoktur). Bir ifade, saklanamayan sonuç üretiyorsa intsessizce dönüştürülür .longint


11

Basit, python 3.4 ve üstü için

print (type(variable_name))

Python 2.7 ve üstü

print type(variable_name)

10

Gerçekten ne demek istediğine bağlı. Python 2.x'de, tarihsel nedenlerle int(sınırlandırılmış sys.maxint) ve long(sınırsız kesinlik) olmak üzere iki tamsayı türü vardır . Python kodunda, bu biraz fark yaratmamalıdır, çünkü bir sayı çok büyük olduğunda yorumlayıcı otomatik olarak uzunluğa dönüşür. Temel yorumlayıcıda kullanılan gerçek veri türleri hakkında bilgi edinmek istiyorsanız, bu uygulamaya bağlıdır. (CPython'lar Objects / intobject.c ve Objects / longobject.c'de bulunur.) Sistem türleri hakkında bilgi edinmek için struct modülünü kullanmak için cdleary yanıtına bakın.


7

Python2.x için şunu kullanın:

print type(variable_name)

Python3.x için şunu kullanın:

print(type(variable_name))

-29

Sadece yapma. Bir şeyin türünü istemek kendi başına yanlıştır. Bunun yerine polimorfizm kullanın. Mümkün olan herhangi bir giriş türü için ne istediğinizi yapan yöntemi kendiniz tanımlayın veya gerekirse tanımlayın ve sadece hiçbir şey sormadan arayın. Bir üçüncü taraf kitaplığı tarafından tanımlanan yerleşik türlerle veya türlerle çalışmanız gerekiyorsa, her zaman bunlardan devralabilir ve bunun yerine kendi türevlerinizi kullanabilirsiniz. Veya bunları kendi sınıfınıza sarabilirsiniz. Bu tür sorunları çözmenin nesne yönelimli yoludur.

Tam türü kontrol etmek ve ifburaya kirli bazı yerleştirmek konusunda ısrar ederseniz , bunu yapmak için __class__özellik veya typeişlevi kullanabilirsiniz, ancak yakında tüm bu ifs'yi her iki veya üç taahhütte bir ek vakalarla güncelleyeceğinizi göreceksiniz . Bunu OO yolunda yapmak bunu önler ve bunun yerine yeni bir giriş türü için yalnızca yeni bir sınıf tanımlamanızı sağlar.


4
Bu cevabın var olanlara ne eklediğini gerçekten bilmiyorum (belki de ilk cümlenin ötesinde?)
user2305193
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.