4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3

Dropbox'ın Python kodu için bir tür kontrol sistemi uygularken izlediği yol hakkındaki materyalin çevirisinin üçüncü bölümünü dikkatinize sunuyoruz.

4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3

→ Önceki parçalar: ilk и ikinci

4 milyon satırlık kod yazımına ulaşıldı

Bir diğer büyük zorluk (ve dahili olarak ankete katılanlar arasında ikinci en yaygın endişe), Dropbox'taki tür kontrollerinin kapsadığı kod miktarının artırılmasıydı. Bu sorunu çözmek için, yazılan kod tabanının boyutunu doğal olarak büyütmekten mypy ekibinin çabalarını statik ve dinamik otomatik tür çıkarımına odaklamaya kadar çeşitli yaklaşımlar denedik. Sonuçta basit bir kazanma stratejisi yokmuş gibi görünüyordu ancak birçok yaklaşımı birleştirerek açıklamalı kod hacminde hızlı bir büyüme elde etmeyi başardık.

Sonuç olarak, en büyük Python havuzumuz (arka uç koduyla birlikte) yaklaşık 4 milyon satırlık açıklamalı koda sahiptir. Statik kod yazımıyla ilgili çalışmalar yaklaşık üç yılda tamamlandı. Mypy artık yazma sürecini izlemeyi kolaylaştıran çeşitli kod kapsamı raporlarını destekliyor. Özellikle, örneğin bir türün açık kullanımı gibi türlerdeki belirsizlikleri içeren kodlarla ilgili raporlar oluşturabiliriz. Any doğrulanamayan ek açıklamalarda veya tür ek açıklamaları olmayan üçüncü taraf kitaplıkların içe aktarılması gibi şeylerde. Dropbox'ta tür kontrolünün doğruluğunu artırmaya yönelik bir projenin parçası olarak, merkezi bir Python deposundaki bazı popüler açık kaynak kitaplıklar için tür tanımlarının (saplama dosyaları olarak adlandırılan) geliştirilmesine katkıda bulunduk. daktilo.

Bazı belirli Python kalıpları için daha kesin türlere izin veren tür sisteminin yeni özelliklerini uyguladık (ve sonraki PEP'lerde standartlaştırdık). Bunun dikkate değer bir örneği TypeDict, her biri kendi türünde bir değere sahip olan sabit bir dizi anahtara sahip JSON benzeri sözlükler için türler sağlar. Tip sistemini genişletmeye devam edeceğiz. Bir sonraki adımımız muhtemelen Python'un sayısal yeteneklerine yönelik desteği geliştirmek olacaktır.

4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3
Açıklamalı kodun satır sayısı: sunucu

4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3
Açıklamalı kodun satır sayısı: istemci

4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3
Açıklamalı kodun toplam satır sayısı

Dropbox'ta açıklamalı kod miktarını artırmak için yaptığımız şeylerin ana özelliklerine genel bir bakış:

Ek açıklama titizliği. Yeni koda açıklama eklemenin titizliğine ilişkin gereksinimleri kademeli olarak artırdık. Halihazırda bazı ek açıklamalara sahip olan dosyalara ek açıklamalar eklenmesini öneren linter ipuçlarıyla başladık. Artık yeni Python dosyalarında ve mevcut dosyaların çoğunda tür açıklamalarına ihtiyacımız var.

Raporların yazılması. Ekiplere, kodlarını yazma düzeyine ilişkin haftalık raporlar gönderiyoruz ve ilk olarak nelere açıklama eklenmesi gerektiği konusunda tavsiyelerde bulunuyoruz.

Mypy'nin popülerleşmesi. Etkinliklerde mypy hakkında konuşuyoruz ve tür ek açıklamalarına başlamalarına yardımcı olmak için ekiplerle konuşuyoruz.

Anketler. Büyük sorunları tespit etmek için periyodik kullanıcı anketleri yapıyoruz. Bu sorunları çözmede oldukça ileri gitmeye hazırız (hatta mypy'yi hızlandırmak için yeni bir dil bile yaratıyoruz!).

Verim. Daemon ve mypyc'yi kullanarak mypy'nin performansını büyük ölçüde geliştirdik. Bu, açıklama işlemi sırasında ortaya çıkan rahatsızlıkları gidermek ve büyük miktarda kodla çalışabilmek için yapıldı.

Editörlerle entegrasyon. Mypy'nin Dropbox'ta popüler olan düzenleyicilerde çalıştırılmasını destekleyecek araçlar geliştirdik. Buna PyCharm, Vim ve VS Code dahildir. Bu, koda açıklama ekleme ve işlevselliğini kontrol etme sürecini büyük ölçüde basitleştirdi. Bu tür eylemler, mevcut koda açıklama eklenirken yaygındır.

Statik analiz. Statik analiz araçlarını kullanarak işlev imzalarını çıkarmak için bir araç oluşturduk. Bu araç yalnızca nispeten basit durumlarda çalışabilir, ancak çok fazla çaba harcamadan kod türü kapsamımızı artırmamıza yardımcı oldu.

Üçüncü taraf kütüphaneler için destek. Projelerimizin çoğu SQLAlchemy araç setini kullanıyor. PEP 484 türlerinin doğrudan modelleyemediği Python'un dinamik özelliklerinden yararlanır. PEP 561'e uygun olarak ilgili saplama dosyasını oluşturduk ve mypy için bir eklenti yazdık (açık kaynak), SQLAlchemy desteğini geliştiren.

Karşılaştığımız zorluklar

4 milyon satırlık yazılı koda giden yol bizim için her zaman kolay olmadı. Bu yolda birçok çukurla karşılaştık ve birçok hata yaptık. Bunlar karşılaştığımız sorunlardan bazıları. Bunları anlatmanın başkalarının da benzer sorunlardan kaçınmasına yardımcı olacağını umuyoruz.

Kayıp dosyalar. Çalışmalarımıza sadece az miktarda dosyayı kontrol ederek başladık. Bu dosyalarda yer almayan hiçbir şey kontrol edilmedi. Dosyalar, içlerinde ilk açıklamalar göründüğünde tarama listesine eklendi. Doğrulama kapsamı dışında bulunan bir modülden bir şey içe aktarıldıysa, o zaman aşağıdaki gibi değerlerle çalışmaktan bahsediyorduk: Any, bunlar hiç test edilmedi. Bu, özellikle geçişin ilk aşamalarında yazma doğruluğunda önemli bir kayba yol açtı. Bu yaklaşım şu ana kadar şaşırtıcı derecede iyi çalıştı, ancak tipik bir durum, dosyaların inceleme kapsamına eklenmesinin kod tabanının diğer bölümlerindeki sorunları ortaya çıkarmasıdır. En kötü durumda, türlerin birbirinden bağımsız olarak zaten kontrol edildiği iki izole kod alanı birleştirildiğinde, bu alanların türlerinin birbiriyle uyumsuz olduğu ortaya çıktı. Bu durum açıklamalarda birçok değişiklik yapılması ihtiyacını doğurdu. Şimdi geriye dönüp baktığımızda, çekirdek kütüphane modüllerini mypy'nin tip kontrol alanına daha erken eklememiz gerektiğini anlıyoruz. Bu, çalışmalarımızı çok daha öngörülebilir hale getirecektir.

Eski koda açıklama ekleme. Başladığımızda yaklaşık 4 milyon satırlık mevcut Python kodumuz vardı. Tüm bu koda açıklama eklemenin kolay bir iş olmadığı açıktı. Testler yürütülürken tür bilgilerini toplayabilen ve toplanan bilgilere dayanarak kodunuza tür açıklamaları ekleyebilen PyAnnotate adında bir araç oluşturduk. Ancak bu aracın özellikle yaygın bir şekilde benimsendiğini fark etmedik. Tür bilgilerinin toplanması yavaştı ve otomatik olarak oluşturulan ek açıklamalar çoğu zaman birçok manuel düzenlemeyi gerektiriyordu. Kodu her incelediğimizde bu aracı otomatik olarak çalıştırmayı veya küçük hacimli gerçek ağ isteklerini analiz etmeye dayalı tür bilgileri toplamayı düşündük, ancak her iki yaklaşım da çok riskli olduğundan bunu yapmamaya karar verdik.

Sonuç olarak, kodun çoğuna sahipleri tarafından manuel olarak açıklama eklendiği not edilebilir. Bu süreci doğru yöne yönlendirmek için özellikle önemli modüller ve açıklanması gereken işlevler hakkında raporlar hazırlıyoruz. Örneğin yüzlerce yerde kullanılan bir kütüphane modülü için tip açıklamalarının sağlanması önemlidir. Ancak yenisiyle değiştirilen eski bir hizmete açıklama eklemek artık o kadar önemli değil. Ayrıca eski kod için tür açıklamaları oluşturmak amacıyla statik analiz kullanmayı da deniyoruz.

Döngüsel ithalat. Yukarıda, varlığı mypy'yi hızlandırmayı zorlaştıran döngüsel ithalattan ("bağımlılık karmaşası") bahsetmiştim. Ayrıca mypy'nin bu döngüsel içe aktarmaların neden olduğu her türlü deyimi desteklemesini sağlamak için de çok çalışmamız gerekiyordu. Yakın zamanda mypy'nin döngüsel içe aktarmayla ilgili sorunlarının çoğunu çözen büyük bir sistem yeniden tasarım projesini tamamladık. Bu sorunlar aslında projenin ilk günlerinden, mypy projesinin başlangıçta odaklandığı eğitim dili olan Alore'dan kaynaklanıyordu. Alore sözdizimi, döngüsel içe aktarma komutlarıyla sorunları çözmeyi kolaylaştırır. Modern mypy, daha önceki basit fikirli uygulamasından bazı sınırlamaları miras almıştır (ki bu, Alore için çok uygundu). Python, esas olarak ifadelerin belirsiz olması nedeniyle döngüsel içe aktarmalarla çalışmayı zorlaştırır. Örneğin, bir atama işlemi aslında bir tür takma adını tanımlayabilir. Mypy, içe aktarma döngüsünün çoğu işlenene kadar bu gibi şeyleri her zaman tespit edemez. Alore'da böyle belirsizlikler yoktu. Sistem geliştirmenin ilk aşamalarında alınan kötü kararlar, yıllar sonra programcıya hoş olmayan bir sürpriz sunabilir.

Sonuçlar: 5 milyon satır koda ve yeni ufuklara giden yol

Mypy projesi, ilk prototiplerden 4 milyon satırlık üretim kodu türünü kontrol eden bir sisteme kadar uzun bir yol kat etti. Mypy geliştikçe Python'un tür ipuçları standartlaştırıldı. Bugünlerde Python kodunu yazma konusunda güçlü bir ekosistem gelişti. Kütüphane desteği için bir yeri vardır, IDE'ler ve editörler için yardımcı araçlar içerir, her birinin kendi artıları ve eksileri olan çeşitli tip kontrol sistemleri vardır.

Dropbox'ta tür kontrolü zaten verilmiş olsa da, Python kodunu yazmanın hala ilk günlerinde olduğumuza inanıyorum. Tip kontrol teknolojilerinin gelişmeye ve gelişmeye devam edeceğini düşünüyorum.

Büyük ölçekli Python projenizde henüz yazım denetimini kullanmadıysanız, statik yazmaya başlamanın şimdi çok iyi bir zaman olduğunu bilin. Benzer geçişi yapanlarla konuştum. Hiçbiri pişman olmadı. Tür kontrolü, Python'u büyük projeler geliştirmeye "normal Python"dan çok daha uygun bir dil haline getirir.

Sevgili okuyucular! Python projelerinizde tip kontrolünü kullanıyor musunuz?

4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3
4 milyon satırlık Python kodunu kontrol etmenin yolu. Bölüm 3

Kaynak: habr.com

Yorum ekle