Veriler, herhangi bir programlama projesindeki en önemli unsurdur. Tüm programlar, verilerle belirli etkileşimlere sahiptir. Örneğin, projeniz bir web sitesi ise, verileri (örneğin metinler ve resimler) kullanıcı dostu bir şekilde sunmanız gerekir. Projeniz finansal eğilimleri tahmin etmek için makine öğrenimini kullanıyorsa, modelleriniz tarafından öğrenilebilecek veriler hazırlamanız gerekir.
Genel amaçlı bir programlama dili olan Python, projelerinizdeki verilerin yönetimini desteklemek için çok yönlü bir araç bataryasına sahip olacak şekilde gelişmiştir. Bu araçlar arasında veri sınıfları, kullanışlı ancak anlaşılması kolay bir tekniktir. Bu makalede, bu veri yönetimi aracını kullanmaya başlamanıza olanak tanıyan önemli vurgularla sizi veri sınıfı modeliyle tanıştırmak istiyorum.
Veri sınıfıyla ilgili işlevler
dataclasses, standart Python kitaplığının bir parçası olan modülde tanımlanır . Bu modülün en önemli unsuru
dataclassdekoratördür. Aşağıdaki kod,
dataclassbir restorandaki faturaları yönetmek için tanımladığımız özel sınıfımız için dekoratörü nasıl kullandığımızı gösterir .
Özellikle,
dataclasstanımladığımız özel sınıfı dekore etmek için dekoratör kullanıyoruz . Tanımlanan sınıfta, sınıfa ait olan nitelikleri (veri sınıfları için alanlar olarak adlandırılır) belirtiriz.
dataclassDekoratörle neden uğraştığımızı sorabilirsiniz . Çünkü bu dekoratör,
__init__ve gibi bazı kazan plakalarından kurtulmamıza yardımcı olabilir
__repr__. Başka bir deyişle, özel sınıfımız için bu dekoratörü kullandığımızda, bu işlevleri uygulamamız gerekmez - bunun yerine, aşağıda gösterildiği gibi, dekoratör bizim için bununla ilgilenecektir.
Yukarıda gösterildiği gibi, başlatma ve temsil yöntemlerini açıkça tanımlamadan, her ikisi de deyimsel olarak uygulanır. Havalı değil mi?
Yukarıda gösterilen veri sınıfında, alanlarının tümü, türlerini açıkça belirtmek için tür ek açıklamalarına sahiptir. Sonuçta, veri sınıfları çoğunlukla verileri işlemek için geliştirilir ve veri sınıfının tuttuğu veri türleri konusunda açık olduğumuz anlamına gelir.
Mekanik olarak konuşursak, veri sınıfının alanlarının tür ek açıklamalarına sahip olması gerekir. Aksi takdirde kodunuz çalıştırılamaz. Kaputun altında,
dataclassdekoratör, sınıfınızın ek açıklamalarına dayalı olarak
__annotations__özel yöntem kullanılarak alınabilen alanlar oluşturur .
>>> Bill.__annotations__ {'table_number': <class 'int'>, 'meal_amount': <class 'float'>, 'served_by': <class 'str'>, 'tip_amount': <class 'float'>}
@dataclass ... class SpecialBill: ... table_number: int = 888 ... meal_amount: float ... served_by: str ... tip_amount: float = 0.0 ... Traceback (most recent call last): ...some traceback info omitted TypeError: non-default argument 'meal_amount' follows default argument
İlklendirme ve temsil yöntemlerinin yanı sıra,
dataclassdekoratör ayrıca karşılaştırma ile ilgili işlevleri bizim için uygular. Normal bir özel sınıf için, karşılaştırma davranışlarını tanımlamazsak örnekler arasında anlamlı karşılaştırmalar yapamayacağımızı biliyoruz.
dataclassDekoratör kullanmayan aşağıdaki özel sınıfı düşünün .
Yukarıda gösterildiği gibi, normal bir sınıfla, tüm öznitelikler için aynı değerlere sahip iki örnek eşit olmayan olarak değerlendirilir çünkü bu özel sınıf örnekleri varsayılan olarak kimlikleriyle karşılaştırılır. Bu durumda, bu iki örnek iki farklı nesnedir ve eşit olmadıkları kabul edilir.
Ancak, bir veri sınıfıyla, böyle bir eşitlik karşılaştırması değerlendirilir
True. Bunun nedeni,
dataclassdekoratörün otomatik olarak
__eq__bizim için özel yöntemi üretmesidir . Özellikle, eşitlik karşılaştırması, bu örneklerden her biri, alanları tanımlanan sırayla içeren bir demetmiş gibi yapılır. İki veri sınıfı örneği aynı değerlere sahip alanlara sahip olduğundan, bunlar eşit kabul edilir.
Büyüktür ve küçüktür gibi eşitsizlik karşılaştırmalarına ne dersiniz? Dekoratörle, aşağıda Satır 1'de gösterildiği gibi, dekoratör
dataclassiçin
orderparametre belirleyerek de mümkündür .
Eşitlik karşılaştırmalarına benzer şekilde, veri sınıfı örnekleri bu alanların tuplesiymiş gibi karşılaştırılır ve sözlüksel olarak tuple olarak karşılaştırılır. Kavramın bir kanıtı için, yukarıdaki kod yalnızca iki alan içerir ve görebileceğiniz gibi, karşılaştırma sonuçları başlığın sırasına dayanır.
Varsayılan olarak, veri sınıflarının alanları değiştirilebilir ve bu nedenle veri sınıfı örneklerinin değiştirilebilir olduğunu söyleyebiliriz. Bu nedenle, bazı insanlar veri sınıflarını değişken isimli tuple olarak adlandırır . Değişkenliklerine ilişkin olarak adlandırılmış tuple'lar ve veri sınıfları arasındaki aşağıdaki karşıtlığı göz önünde bulundurun.
Yukarıda gösterildiği gibi, adlandırılmış bir demetin özniteliğini ayarlayamazsınız. Ancak bunu, veri sınıflarının değişkenliğini desteklemenin avantajlarını vurgulayan bir veri sınıfı örneğiyle yapabiliriz.
Ancak, veri değişkenliği her zaman istenmez. Bazı durumlarda, verilerinizin değiştirilebilir olmasını istemezsiniz. Böyle bir senaryoda, dekoratörü kullandığınızda
frozenparametreyi belirtmeyi düşünebilirsiniz . Önemsiz bir örnek aşağıda gösterilmiştir.
True
dataclass
Bir veri sınıfı, özünde diğer normal özel sınıflarla aynı genişletilebilirliğe sahiptir. Bu nedenle, böyle bir ihtiyacımız varsa bir veri sınıfını alt sınıflara ayırabiliriz.
Yukarıdaki kod parçacığında gösterildiği gibi,
dataclassdekoratör alt sınıf için temel sınıfın alanlarını dikkate alacaktır. Başka bir deyişle, alt sınıfın başlatılmasından da görebileceğiniz gibi, otomatik olarak temel sınıftan ve alt sınıfın kendisinden alanların imzasına sahiptir. Özellikle, sıra, tanım sırasına dayanır - temel sınıfın alanları önce gelir ve alt sınıfın alanları sonra gelir ve eğer birden çok nesil alt sınıflara sahipseniz.
Alt sınıftaki bu alanların sırası ve veri sınıflarının varsayılan değerlere sahip alanlarının varsayılan değerler olmayan alanlardan önce gelmesi gerekliliği nedeniyle, bunun anlamı, bir temel sınıfın varsayılan değerlere sahip alanlara sahip olması durumunda, alt sınıfların eklenen alanlarının varsayılan değerlere sahip olması gerektiğidir. değerler de. Aksi takdirde, şu hatayı görebilirsiniz - daha önce gördüğümüz hatanın aynısı.
@dataclass ... class BaseBill: ... meal_amount: float = 20 ... @dataclass ... class TippedBill(BaseBill): ... tip_amount: float ... Traceback (most recent call last): ... some traceback info omitted TypeError: non-default argument 'tip_amount' follows default argument
Yukarıdaki örneklerde, alanların tümü kayan sayılar ve dizeler gibi değişmez veri türleridir. Veri sınıfının alanları olarak değişken veriyi kullanmamız gerekirse ne yapmalıyız? Python programcılarının yapabileceği bazı hataları içeren aşağıdaki kod parçacığını düşünün.
Yukarıdaki kod, işleviniz değiştirilebilir bir varsayılan değer kullandığında, değişebilir bir örnek kullanarak varsayılan değeri gerçekten ayarlayamayacağınızı gösterir çünkü bu nesne, parametreyi belirtmeyen tüm arayanlar tarafından paylaşılacaktır. Yukarıdaki örnekte, görebileceğiniz gibi, her iki örnek de aynı temel liste nesnesini paylaşıyor ve bu da istenmeyen yan etkilere neden oluyor.
Veri sınıfları bağlamında soru, değiştirilebilir alanlar için varsayılan bir değeri nasıl belirleyebileceğimizdir. Aşağıdakileri yapmamalıyız ve bir
ValueErroristisna ortaya çıkacaktır.
@dataclass class IncorrectBill: costs_by_dish: list = [] ValueError: mutable default <class 'list'> for field costs_by_dish is not allowed: use default_factory
fieldFonksiyonu
dataclassesmodülden içe aktarıyoruz.
fieldfonksiyonu, biz belirtmek
listolmak
default_factoryparametresi. Temelde, bu parametre, örnek oluşturulacağı zaman kullanılacak sıfır parametre işlevi olan varsayılan fabrika işlevini ayarlar. Bu durumda
listişlev, çağırdığımızda yeni bir liste nesnesi oluşturan bir liste nesnesinin yapım yöntemidir
list().
costs_by_dishbeklendiği gibi öznitelik için ayrı liste nesneleri var .
Bu makalede, Python'daki veri sınıflarına başlamak için bilmemiz gereken en temel altı öğeyi gözden geçirdik. Temelde, verileri depolamak için çok kullanışlıdırlar ve
dataclassdekoratör bizim için birçok kazan plakasıyla ilgilenir. Adlandırılmış demetlerle karşılaştırıldığında, değişkenliğe izin vererek daha esnektirler.
Önceki deneyimlerim sırasında birçok görüşme sürecine dahil oldum. Ve bu kolay bir egzersiz değil.
Bu, kod incelemeleriyle ilgili ilk makalem değil. Makalem Bu Kod İnceleme Görgü Kuralları Ekip Kültürünüzü Nasıl Şekillendirebilir? Kod incelemeleri yoluyla ekip moralini nasıl iyileştirebileceğinize yönelik bir girişim, okuyucularımdan ve meslektaşlarımdan olumlu geri bildirimler aldı.
Pragmatik Programcı ilk olarak 1999'da yayınlandı ve o zamandan beri tüm zamanların en iyi programlama kitabı seçildi. Yazarlar Andy Hunt ve David Thomas, Agile Manifesto'nun orijinal yazarları arasındaydı ve bazı ciddi referanslara sahipler.
Saldırganların herkese açık GraphQL arabiriminizi kullanarak sitenizi nasıl kazıyabileceğini veya hizmet reddi saldırıları gerçekleştirebileceğini öğrenin. Bunu dört yoldan biriyle yapabilirler: yürütmek için tek bir büyük sorguyu dikkatlice oluşturarak, ilgili verileri getirebilecek çok sayıda paralel sorgu yazarak, arka arkaya çok sayıda sorgu göndermek için toplu istekleri kullanarak ve son olarak çok sayıda istek göndererek.
Teknoloji endüstrisindeki bir pozisyon için mülakat yaparken, herhangi bir teklif değerlendirilmeden önce genellikle en az üç tur mülakattan geçeceksiniz. Mermiler genellikle şuna benzer: Eğer öyle düşünüyorsan, yanılıyorsun.
Harika geliştiriciler yapan teknik olmayan şeyler Bir süredir bu makaleyi yazmayı erteliyorum - yazmak için hiç nitelikli hissetmedim. Bugün onu yazma zamanının geldiğini düşündüm.