Python'da bir değişkenin sözlük olup olmadığını nasıl kontrol edersiniz?
Bu mükemmel bir soru, ancak en çok oylanan cevabın kötü bir öneriye yol açması talihsiz bir durum type(obj) is dict
.
(Ayrıca dict
değişken adı olarak kullanmamanız gerektiğini unutmayın - bu yerleşik nesnenin adıdır.)
Başkaları tarafından içe aktarılacak ve kullanılacak kod yazıyorsanız, doğrudan dict yerleşimini kullanacaklarını varsaymayın - bu varsayımın kodunuzu daha esnek hale getirmesi ve bu durumda, programda hata yapmayacak kolayca gizlenebilecek hatalar yaratın .
Gelecekteki kullanıcılar için doğruluk, sürdürülebilirlik ve esneklik amacıyla, daha esnek, deyimsel ifadeler olduğunda kodunuzda asla daha az esnek, tek yönlü ifadeler olmamasını şiddetle öneririm.
is
nesne kimliği için bir testtir . Kalıtımı desteklemez, herhangi bir soyutlamayı desteklemez ve arabirimi desteklemez.
Bu yüzden birkaç seçenek sunacağım.
Destekleyici miras:
Kullanıcıların kendi dict alt sınıfını veya tedarik için izin verir, çünkü bu, ben yapacak ilk öneri OrderedDict
, defaultdict
ya Counter
koleksiyonları modülü dan:
if isinstance(any_object, dict):
Ancak daha esnek seçenekler de var.
Destekleyici soyutlamalar:
from collections.abc import Mapping
if isinstance(any_object, Mapping):
Bu, kodunuzun kullanıcısının herhangi bir alt sınıfını da içeren dict
ve yine de doğru davranışı elde eden soyut bir Eşleme'nin kendi özel uygulamasını kullanmasına izin verir .
Arayüzü kullanın
OOP tavsiyesini, "bir arayüze program" ifadesini sık sık duyarsınız.
Bu strateji Python'un polimorfizminden veya ördek tiplemesinden yararlanır.
Dolayısıyla, sadece belirli beklenen hataları yakalamak arayüzüne erişmek girişiminde ( AttributeError
durumunda hiçbir yoktur .items
ve TypeError
durumda items
çağrılabilir değildir) makul bir yedek kullanımıyla - ve şimdi uygular arayüzü size onun öğeleri (not vereceğini herhangi sınıfta .iteritems()
Python gitti 3):
try:
items = any_object.items()
except (AttributeError, TypeError):
non_items_behavior(any_object)
else: # no exception raised
for item in items: ...
Belki de bunun gibi ördek yazmayı kullanmak çok fazla yanlış pozitifliğe izin vermede çok ileri gidebilir ve bu kod için hedeflerinize bağlı olabilir.
Sonuç
is
Standart kontrol akışı türlerini kontrol etmek için kullanmayın . Arayüzü doğrudan kullanarak kullanın veya veya isinstance
gibi soyutlamaları göz önünde bulundurun ve yazım denetiminden tamamen kaçınmayı düşünün.Mapping
MutableMapping