Python, listede herhangi bir tür olup olmadığını kontrol ediyor mu?


90

Nasıl yapmalıyım:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

Aptalca görünüyor, sınıf bilgileri listesine giremem:

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

Peki isinstanceofanyişlevi nedir?


Bir sayı gibi toplarsa, bir sayı gibi çıkarırsa, bir sayı gibi çarparsa ... bir sayı olup olmadığını neden bilmeniz gerekir? Daha fazla ayrıntı için ördek yazma konusuna bakın .
Makoto

Benim özel kullanım durumum, (dönen bir fonksiyon (bir numberOR, bir sympy ifadesi döndürür)) döndüren bir fonksiyona sahip olmaktır. Oluşturduğum işlevin, onu diğer işlevlere geçirdiğimde yapması gerekeni yaptığını kontrol etmek istiyorum.
D Adams

İşleviniz neden homojen bir şey döndürmüyor? İşte koku burada; ördek yazarak hızlı ve gevşeyebilirsiniz, ancak geri döndüğünüzde tutarlı olmalısınız.
Makoto

Sanırım bazen bir sayı olarak değerlendirilen ve bazen içinde değişkenler kalan bir sympy ifadesini her zaman döndürebilirim.
D Adams

Burada yapmak istediğini düşündüğüm şey bu; birden çok farklı tür döndürmek yerine, bir türü döndürün ve gerekirse bir sayıya düşürün.
Makoto

Yanıtlar:


200

isinstance()ikinci argüman için bir grup sınıf alır . İlk bağımsız değişken, bu dizideki türlerden herhangi birinin bir örneğiyse, doğru döndürür :

isinstance(var, (classinfo1, classinfo2, classinfo3))

Başka bir deyişle, isinstance() zaten kutunun dışında, bu işlevselliği sunuyor.

Gönderen isinstance()belgeler :

Classinfo bir sınıf nesnesi veya bir tür nesnesi değilse , sınıf veya tür nesnelerinin bir demeti olabilir veya bu tür diğer tuplelarları tekrarlı olarak içerebilir (diğer sıra türleri kabul edilmez).

Vurgu benim; yinelemeli doğaya dikkat edin; (classinfo1, (classinfo2, classinfo3))aynı zamanda geçerli bir seçenektir.


12

Şimdiden sorunuzun başlığına oldukça yakındınız. anyVe bir liste kullanabilirsiniz :

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

Ancak isinstanceifşa belgelerine baktığımızda:

Nesne bağımsız değişkeni, classinfo bağımsız değişkeninin veya bunun (doğrudan, dolaylı veya sanal) bir alt sınıfının bir örneğiyse true döndürür. Nesne belirtilen türde bir nesne değilse, işlev her zaman yanlış döndürür. Classinfo bir sınıf (tür nesnesi) değilse, bu tür nesnelerin bir demeti olabilir veya bu tür diğer tupl'ları tekrarlı olarak içerebilir (diğer sıra türleri kabul edilmez). Classinfo bir tür veya türler grubu ve bu tür tuple değilse, bir TypeError istisnası ortaya çıkar.

Bu, bunu yapmanın daha iyi yolunun

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))

2
Tekrarlayan isinstanceyalnızca classinfodeğişen bana çok Pythonic görünmüyor.
Makoto

1
Deneyin var.__class__. İstediğin bu mu? @Makoto: Katılıyorum. Pythonic değil!
flamenko

@Makoto Yup. Ama bu, D Adams'ın dokümanları "herhangi biri" için arayarak kolayca bulabileceği bir şeydi. Cevabımı daha iyi versiyona genişlettim ... ama belli ki Martijn Pieters daha hızlıydı ... bir kez daha.
Martin Thoma

3
any()bir liste ile .. anlamsız. Kullanmanız gerekiyorsa bir üreteç ifadesi kullanın any(), o zaman en azından erken çıkıştan faydalanırsınız.
Martijn Pieters

Bence isinstancetuple ile gitmenin yolu. anyBaşlıkta istediği gibi görünen çözüme değinmek istedim .
Martin Thoma

4

Bu sorununu çözecektir:

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

Belgelere dayanarak, türlerin değerlerini içine geçirmenin birçok yolu vardır isinstance.

Bunun sadece bir parçası olduğu daha karmaşık bir doğrulama yapmaya çalışıyorsanız, şehvetli de bakabilirsiniz .


isinstance () bu işlevi zaten sunuyor, 2. bağımsız değişken olarak kontrol etmek için gerekli tüm türlerle bir demet
geçirin

@ RFV5s Evet .... burada verdiğim örnek bunu gösteriyor. İtirazın nedir?
Nathaniel Ford

1

Genelde kullanmamalısınız isinstance, ancak yapmak istediğiniz şey any () yerleşik işlevi ile başarılabilir .

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

7
Bu abartıdır; isinstance()işlevselliği kullanmadan kutusundan çıkarır any().
Martijn Pieters

@MartijnPieters Durumun birden fazla türü alabileceğini bilmiyordum, ancak cevabın hala iyi olduğunu düşünüyorum çünkü soru daha geniş bir şekilde ele alınabilir: "Belirli bir işlevden herhangi bir dönüş değeri olup olmadığını nasıl kontrol ederim farklı parametreler doğrudur "
Chad S.

Kullanmanız gerekip gerekmediği önemli değil isinstance().
RFV

@ChadS. Neden kullanmaması gerektiğini size sormak isterim isinstance()? Teşekkür ederim.
idature

Çünkü python, tür kontrolünden kaçınır. Az fayda için çok fazla ekstra kod (ve CPU döngüsü). Ördek yazımı tercih edilir.
Chad S.
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.