SORU
11 EKİM 2009, Pazar


İsinstance arasındaki farklar() ve type() python

Bu iki kod parçaları arasındaki farklar nelerdir? Hangi yol daha pythonic olarak kabul edilir?

type() kullanarak:

import types

if type(a) is types.DictType:
    do_something()
if type(b) in types.StringTypes:
    do_something_else()

isinstance() kullanarak:

if isinstance(a, dict):
    do_something()
if isinstance(b, str) or isinstance(b, unicode):
    do_something_else()

Düzenleme:Bu tartışılacak gibi görünüyor zaten: link.

CEVAP
11 EKİM 2009, Pazar


Diğer içeriği (zaten iyi!) özetlemek cevapları isinstance kalıtım türetilmiş bir sınıf örneği . hitap ^em>birbir temel sınıf örneği), type eşitliği için ise kontrol (tip kimlik talepleri ve alt, NAM-ı diğer alt sınıfların örneklerini reddeder) değildir.

Normalde Python kodunuzu miras, elbette destek (miras çok kullanışlı olduğu için, kodu kullanma ve seninki kullanarak durdurmak için kötü olurdu!), isinstance sorunsuz miras desteklediğinden types kimlik denetimi daha az kötü.

isinstance o değiliyisadece sizi zihindaha az kötüdaha tür eşitlik denetimi. Normal, Pythonic, tercih edilen bir çözüm hemen hemen her zaman "ördek yazarak": argümanı kullanmayı deneyingibioldu belirli bir istenen, yazın bunu try/except açıklama alıcı tüm istisnalar olabilir ortaya çıkması durumunda, bağımsız değildi aslında bu tür (ya da başka bir türü güzel ördek-taklit; -) ve except yan, başka bir şey deneyin (kullanma bağımsız değişken "gibi" başka bir türü).

basestringancak, oldukça özel bir durum var olan yerleşik bir türsadeceisinstance (str Unicode basestring alt sınıf) kullanalım. Dizeleri diziler (sen-ebil döngü içinde onları, dizin onları, dilim, ...), ama genellikle istediğim için onları tedavi olarak "skaler" tür ... biraz uygunsuz (ama oldukça sık kullanılması durumunda) tedavi etmek için her türlü dizeleri (ve belki de diğer skaler tip, yani, olanlar edemezsin döngü) bir şekilde, tüm kaplar (listeler, kümeler, dicts, ...) başka bir yol, ve basestring artı isinstance bu deyim genel yapısı gibi bir şey olduğunu mu yardımcı olur:

if isinstance(x, basestring)
  return treatasscalar(x)
try:
  return treatasiter(iter(x))
except TypeError:
  return treatasscalar(x)

basestring bir olduğunu söyleyebilirizSoyut Temel Sınıf("ABC") somut işlevler alt sınıflar için fazla değil,"", esas isinstance. ile kullanmak için bir işaretleyici olarak var -- Bu kavram bir genelleme getiren PEP 3119, kabul edildi ve Python 2.6 ve 3.0 ile başlayan uygulanmadı beri açıkçası Python artıyor.

KEP, Akk sık sık ördek yazarak yerini alamayacak olsa da, genellikle bunu yapmak için büyük bir baskı var ve bu durum net (here) yapar. Akk uygulanan son Python sürümleri var ancak teklif ekstra hediyeler: isinstance (issubclass) şimdi demek daha adil "[örnek] bir türetilmiş sınıf" (özellikle, herhangi bir sınıf olabilir "kayıtlı" olan bir ABC ki gibi bir alt sınıf ve örnekleri örneği ABC); ve Akk da teklif ekstra rahatlık için gerçek alt sınıflar içinde bir çok doğal yol ile Template Method tasarım deseni uygulamaları (here here [[Bölüm II]] için daha TM DP, genel ve özel Python, bağımsız Akk).

Python here; 3.1 sürümü için, çok benzer görmek 2.6, teklif olarak ABC yatan mekaniği için here destek. Her iki versiyonda da, 36* *standart kütüphane modülü (bu çok benzer 2.6 sürümü için 3.1 sürüm -- here) birkaç yararlı Akk sunmaktadır.

Bilerek bu cevap, en önemli şey korumak için yaklaşık Akk (ötesinde bir belki daha doğal yerleşim için TM DP işlevselliği yanında klasik Python alternatifin kendisine dahil ederse, sınıflar gibi UserDict.DictMixin) olduğundan emin olun isinstance (issubclass) çok daha çekici ve yaygın (Python 2.6 ve ileri doğru gidiyor) daha eskiden (2.5 ve öncesi), ve bu nedenle, kontrast, kontrol tür eşitlik zaten eskiden daha yeni Python sürümleri bile çok kötü bir uygulama.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • Engadget

    Engadget

    18 EYLÜL 2006
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005