Bir değişkenin liste, sözlük veya başka bir şey olup olmadığını belirlemenin basit bir yolu var mı? Her iki türden de olabilecek bir nesne alıyorum ve aradaki farkı anlayabilmem gerekiyor.
Bir nesnenin türünü almak için yerleşik type()
işlevini kullanabilirsiniz. Tek parametre olarak bir nesnenin geçilmesi, o nesnenin tür nesnesini döndürecektir:
>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True
>>> type({})
<type 'dict'>
>>> type([])
<type 'list'>
Bu elbette özel türler için de geçerlidir:
>>> class Test1 (object):
pass
>>> class Test2 (Test1):
pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True
type()`ın yalnızca nesnenin doğrudan türünü döndüreceğini, ancak tür kalıtımı hakkında size bilgi veremeyeceğini unutmayın.
>>> type(b) is Test1
False
Bunu karşılamak için isinstance
işlevini kullanmalısınız. Bu elbette yerleşik tipler için de geçerlidir:
>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True
isinstance()genellikle bir nesnenin türünden emin olmak için tercih edilen yoldur çünkü türetilmiş türleri de kabul edecektir. Dolayısıyla, tür nesnesine gerçekten ihtiyacınız yoksa (herhangi bir nedenle),
type()yerine
isinstance()` kullanmak tercih edilir.
isinstance()ın ikinci parametresi de bir tür demeti kabul eder, böylece aynı anda birden fazla türü kontrol etmek mümkündür. Nesne bu türlerden herhangi birine aitse
isinstance` true değerini döndürür:
>>> isinstance([], (tuple, list, set))
True
Bir try
...except
bloğu kullanmak daha Pythonic olabilir. Bu şekilde, bir liste gibi ya da bir dict gibi davranan bir sınıfınız varsa, türünün gerçekte ne olduğuna bakılmaksızın düzgün davranacaktır.
Açıklığa kavuşturmak gerekirse, değişken tipleri arasındaki farkı "anlatmak" için tercih edilen yöntem duck typing olarak adlandırılan bir yöntemdir: bir değişkenin yanıt verdiği yöntemler (ve dönüş tipleri) alt rutininizin beklediği şey olduğu sürece, ona olmasını beklediğiniz şey gibi davranın. Örneğin, ayraç operatörlerini getattr
ve setattr
ile aşırı yükleyen bir sınıfınız varsa, ancak komik bir iç şema kullanıyorsa, taklit etmeye çalıştığı şey buysa, bir sözlük gibi davranması uygun olacaktır.
Type(A) is type(B)denetimiyle ilgili diğer bir sorun da
A,
Bnin bir alt sınıfıysa, programatik olarak
trueolmasını umduğunuzda
falseolarak değerlendirilmesidir. Bir nesne bir listenin alt sınıfıysa, bir liste gibi çalışmalıdır: diğer cevapta sunulduğu gibi türün kontrol edilmesi bunu önleyecektir. (Ancak
isinstance` işe yarayacaktır).