fieldenum: Python'da Rust tarzı alanlı enum desteği
(github.com/ilotoki0804)- fieldenum, değer taşıyan (örneklenebilir) bir enum'dur.
- Rust'taki alanlı enum'ları temiz bir şekilde destekler.
- Fonksiyonel programlamanın saflığı ile Python'daki pratiklik arasında denge kurmaya çalışır.
- Varsayılan olarak
Noneiçin bir alternatif olanOptionile istisnalar için bir alternatif olanBoundResultdesteği sunar. - Tamamen test edilmiştir.
- İngilizce dokümantasyon henüz zayıf, ancak zamanla geliştirilmesi planlanıyor.
- Issue, PR, star gibi her türlü destek memnuniyetle karşılanır.
14 yorum
dataclass'ın union tipi daha iyi olmaz mı diye düşünüyorum; bildirimin daha kısa olması dışında pek bir avantajını göremiyorum.fieldenum'un özellikle daha iyi olduğu noktalar var mı?Beyanının kısa ve sade olması, ayrıca yalnızca gerekli kısımları içermesi de büyük bir avantaj.
Örneğin,
Yukarıdaki fieldenum'u dataclass ile uygulamak isterseniz, bunu aşağıdaki gibi yazmanız gerekir.
Kod uzuyor, okunması zorlaşıyor, hata yapma olasılığı artıyor ve çok da temiz göründüğü söylenemez, değil mi?
Elbette bu şekilde yazsanız bile, fieldenum'un sunduğu diğer pek çok özelliği de (generics, repr,
__fields__, ...) elde edemezsiniz.Bu nedenle, tüm bunları uygulayıp bir araya getiren fieldenum'un olması çok daha kullanışlıdır.
Bunun dışında,
örneklerbölümündeki içeriklere de göz atmanız faydalı olabilir.dataclassvarsayılan olarakrepruygulamasını desteklerdataclasses.fields, alan tanımları hakkında çalışma zamanı bilgisi sağlartypingmodülü tarafından 3.5'ten beri, sözdizimsel kısayol ise 3.12'den beri destekleniyorMessagesad alanı söz konusu olduğunda, bu modülle uygulanabilirBuna rağmen, class tanımları için gereken boilerplate kodun olmaması ve enum ile class'ı tek bir arayüzle kullanabilme avantajı kesinlikle öne çıkıyor. Ayrıntılı açıklama için teşekkürler
https://stackoverflow.com/a/47784683
Bu şekilde yapıları ifade etmeye yönelik çeşitli girişimler oldu, ancak sonuçta bunun Python'ın bir sınırı ve zayıf yönü olarak görülebileceğini düşünüyorum. ADT'yi (algebraic data type) okulda ilk kez OCaml ile görmüştüm; çalışırken bunu ancak bu şekilde taklit etmek zorunda olmak biraz üzücü geliyor.
ilotoki tarafından oluşturulan kütüphane, ADT'ye en çok yaklaşan örnek olarak görülebilir. Bir gün standart kütüphaneye dahil edilip yaygın olarak kullanılır hale gelirse güzel olur.
Messageuygulamasını Union ile yaparsanız yöntem kalıtımından yararlanamazsınız. ÖrneğinYukarıdaki gibi
.processyöntemini eklerseniz, tüm varyantlarda.process()yöntemini kullanabilirsiniz.Ayrıca bahsettiğim repr, 'ilgili enumun varyantı olarak repr' anlamındaydı.
Örneğin fieldenum, repr çağrısını sarmalayarak şu şekilde çalıştırır.
Özel bir
__repr__yoksa bununMessageenumunun alt varyantı olduğu bilgisi gösterilmez.Quit, çağrı yapmadan kullanılan bir unit varyantıdır.Ayrıca çağrı gerektiren bir varyant türü olan fieldless varyantlarda, singleton oldukları için
isişleciyle kontrol edebilirsiniz.fieldenum kullanmak, bu şekilde gözden kaçması kolay çeşitli uygulama ayrıntılarını otomatik olarak ele almaya yardımcı olur.
Acaba PyCon Korea'da bir sunum yapmayı düşünür müsünüz diye önermek istiyorum. Çok keyifle izledim; geliştirme sürecinde yaşadıklarınızı ve açıklamalarınızı doğrudan sizden dinlemek isterim!
PyCon'da sunum yapabilirsem gerçekten büyük bir onur olur diye düşünüyorum. Sırf benim istememle olup olmayacağını bilmiyorum ama(^^;) düşüneceğim.
Ayrıca İngilizce README'de
Optionörneğinin de açıklanması iyi olurdu.Optionkolay anlaşılır ve daha aşina bir giriş noktası olabilir. Belgelerdeki açıklama sıralamasındaOption'ı önce anlatmak da daha iyi olabilir gibi geliyor bana.İngilizce belge henüz hazır olmadığı için biraz yetersiz... Korece belge yeterince olgunlaştığında İngilizceye çevirmeyi düşünüyorum. Ya da ilgili PR'lar da memnuniyetle karşılanır!
Bana da önce
Option'ı tanıtmanın daha iyi olacağı gibi görünüyor. Düzelteceğim.Oo. İlginçmiş!!
Paylaştığınız Korece belge örnek kodunda düzeltilmesi gereken bir nokta var.
Bize bildirdiğiniz için teşekkürler. Düzelttik!
Bunu GN olarak paylaşmam gerekiyordu ama yanlışlıkla genel olarak paylaşmışım;;
Düzelttim.
Teşekkürler~