(Python) dil değişikliklerini takip etme stratejisi


16

Yıllar sonra da çalışacak kod yazma

Programlama dilleri değişir. Kütüphaneler değişir. 5, 10 ve hatta 20 yıl önceki bazı kodlar yine de çalışıp beklenen sonuçları üretebilirken, 2 yıllık bazı kodlar sözdizimi hatasıyla başarısız olabilir. Bu diller kaçınılmazdır, çünkü diller gelişmektedir (en azından çoğu). Geliştiricilerin kodlarını koruma sorumluluğu vardır. Ancak bazen, kararlılık üretim kodunda önemli bir gereksinimdir ve kod, her yıl kod değişikliklerinden birinin dil değişikliklerine adapte olması gerekmeden 10 yıl boyunca çalışmalıdır. Ya da örneğin bilimsel veri analizi için yıllarca dokunmadan tekrar ziyaret etmem gereken küçük senaryolarım olabilir. Örneğin, meteoroloji bürolarında, hıza bağlı olmayan parçalar için bile çok sayıda operasyonel Fortran kodu vardır ve kod kararlılığı bunun nedenlerinden biridir. BEN' dengesizlik korkusunun, Python'a taşınmaya karşı sahip oldukları nesnelerden biri olduğunu duydum (elbette dil ataleti dışında; sadece eski koda bağımlı olmayan yeni kodlar için mümkündür). Elbette, kararlı kod için bir strateji tüm işletim sistemini dondurmaktır. Ancak bu her zaman mümkün değildir.

Örnek olarak Python kullanıyorum, ancak sorun özellikle Python ile sınırlı değildir.

Python uyumluluğu ile ilgili belgeler

Python söz konusu olduğunda, geriye dönük uyumsuz değişiklikler politikasını özetleyen birkaç belge vardır.

PEP-5

PEP 5'e göre :

Python'un geçiş versiyonunun yayınlanması ile geriye dönük uyumsuz versiyonun yayınlanması arasında en az bir yıllık bir geçiş dönemi olmalıdır. Kullanıcıların programlarını test etmek ve kullanımdan kaldırılmış yapıyı kullanmaktan alternatif olana geçirmek için en az bir yılı olacaktır.

Şahsen, bir yılın oldukça kısa olduğunu düşünüyorum. Bazı kodlar yazabileceğim anlamına geliyor ve bundan 1½ yıl sonra artık çalışmayacak.

PEP 291

PEP 291 , geriye dönük uyumluluğu korumak için kaçınılması gereken şeylerin eksik bir kılavuz listesini içerir. Ancak, sadece Python 2.x ile ilgilidir. Python 2.7 2.x serisinin son sürümü ve Python 2.7 sadece hata düzeltmesi olduğundan, bu PEP artık sadece tarihsel ilgi içindedir.

PEP 387

Geriye dönük uyumsuz değişikliklerde de PEP 387 vardır . PEP 387 resmi bir politika değil taslaktır. Haziran 2009'da, bu Python-ideas posta listesinde tartışıldı . Tartışmanın bir kısmı, geliştiricilerin dil değişikliklerine karşı sağlam kod nasıl yazabileceklerine odaklandı. Bir gönderide ne yapmamanız gerektiğine dair bazı tavsiyeler listelenmiştir :

Bununla birlikte, çoğu zaman doğru olabilecek çıkarım yapabileceğiniz birkaç kural vardır: başlangıçtan bir şeyleri çağırma "_", hiçbir şeyi maymun yamalama, kendi sınıfınız dışındaki sınıflardaki nesnelerde dinamik sınıf değiştirme kullanma , miras hiyerarşilerinin derinliğine bağlı kalmayın (örneğin, hayır ".__bases__[0].__bases__[0]"), testlerinizin herhangi bir DeprecationWarnings üretmeden çalıştığından emin olun, diğer kütüphanelerden miras alan sınıflara öznitelik eklerken potansiyel ad alanı çakışmalarına dikkat edin. Bütün bunların tek bir yerde yazıldığını sanmıyorum.

Buna ek olarak, "maden sahaları" (değişmesi muhtemel yeni özellikler) ve "donmuş alanlar" (çok satılan API'lerin neredeyse değişmemesi garanti edilen) hakkında bazı noktalar vardı. Antoine Pitrou'dan alıntı :

"Donmuş alan" negatif (açık bir "mayın alanı" yerine, olumlu (açık ortak API'ler ve açıkça garanti davranış) tanımlanması gerektiğini düşünüyorum. Aksi takdirde, mayın tarlasına bazı önemli şeyleri koymayı ve daha sonra geriye dönük uyumsuz bir şekilde değiştirmemiz gerektiğinde ısırılmayı unutacağız.

Bu iş parçacığından herhangi bir sonuç yok gibi görünüyor, ancak aradığım şeyin çekirdeğine oldukça yaklaşıyor. İplik neredeyse dört yaşında, bu yüzden belki de durum değişti veya iyileşti. Ne tür bir kodun hayatta kalması muhtemeldir ve ne tür bir kod daha kırılgandır?

Taşıma yönergeleri

Yukarıda belirtilen belgelerin yanı sıra, her bir Python sürümü Taşıma işlemi kılavuz ile birlikte: Python 3.2 için taşıma , Python 3.3 taşıma vs.

Yararlı uyumluluk

PEP 3151 beni kullanışlı uyumluluk kavramıyla tanıştırdı . Kendi sözlerimle, bu sadece kod dikkatlice yazılmışsa dil geliştiricilerin uyumluluğu korumak için dikkatli olmaları gerektiği fikrine dayanır. Gerçekten kullanışlı bir uyumluluk tanımlamıyor , ancak yukarıdaki PEP 387 tartışmasından alıntıladığım fikirlere benzediğini düşünüyorum.

Programcıların bakış açısından

Bir programcı olarak, Python'un gelecekte değişeceğini ve insanların - en önemlisi kendimin - belki birkaç yıl sonra bir, iki veya belki de üç küçük sürüm olan bir Python sürümünde çalıştırmaya çalışacağını biliyorum. Her şey uyumlu olmayacak ve aslında başarısız olacak kod ile gelmek kolay (bir kez kod belirleme ile karşılaştım if sys.version[:3] != '2.3': print 'Wrong version, exiting'). Ne aradığım üzerinde kurallar kümesidir ne yapacağını ve hangi değil yapmak benim kod hala gelecekte değiştirilmemiş çalışacağı şansını artırmak için.

Bu tür yönergeler var mı? Gelecekte hala çalışacak Python kodunu nasıl yazarım?

Sorum standart kütüphanesine değil, aynı zamanda sık kullanılan, Python çekirdeğine hem ilgilidir eklenti kütüphanelerde, özellikle numpy, scipy, matplotlib.


DÜZENLEME : Şimdiye kadar cevapların ikisi python2 ile python3 arasındadır. Demek istediğim bu değil. Python2'den Python3'e taşınacak araçları biliyorum. Sorum henüz gelecek dil değişiklikleri ile ilgili . Daha kararlı olan kodlama kılavuzlarını bulmak için kristal bir toptan daha iyisini yapabiliriz . Örneğin:

  • import moduledaha geleceğe dönüktür from module import *eğer ikincisi kodu kırabilecek çünkü modulebir veya daha fazla yeni işlevleri / sınıfları yetişir.

  • Belgelenmemiş yöntemlerin kullanılması, belgelenmemiş yöntemlerin kullanılmasından daha az geleceğe dönük olabilir, çünkü belgelenmemiş bir şey henüz kararlı olmayan bir şeyin işareti olabilir.

Benim peşimde olduğum bu tür pratik kodlama önerileri. Şimdiki → gelecekle ilgili olduğundan, kendimizi Python3 ile sınırlayabiliriz, çünkü Python2 artık değişmeyecek.

Yanıtlar:


13

Bu, alanımızdaki çözülmemiş bir sorundur. Kodunuzun süresiz çalışacağından emin olmanın bir yolu yoktur. Kodunuz ileriye dönük uyumlu anlamda gerçekten mükemmel olsa bile (ve öyleyse, lütfen şirketim için çalışın!;)), Bir hata veya değişiklik alan başka bir yazılım tarafından çalışıyorsa, kullanıyorsa veya kullanılıyorsa hiçbir şekilde kodunuz çalışmayabilir.

Bu yüzden size bunu yapacak şeylerin bir listesini veremem, eğer onları takip ederseniz başarıyı garanti eder. Ancak yapabileceğiniz şey gelecekteki kırılma riskini en aza indirmek ve etkilerini en aza indirmektir. Daha bilgili bir Pythonist size Python'a daha spesifik tavsiyeler verebilir, bu yüzden daha genel olmalıyım:

  • birim testleri yazma. Bildiğiniz şeyler için bile onlara ihtiyacınız yok.

  • popüler / iyi tasarlanmış / istikrarlı kütüphaneler ve teknolojiler kullanmak, popüler olmayan (ve yakında desteklenmeyecek) olanlardan kaçınmak

  • uygulama ayrıntılarını kullanan kod yazmaktan kaçının. Uygulamalara değil, arayüzlere kodlama. Aynı arabirimin birden çok uygulamasına karşı kodlama. Örneğin, kodunuzu CPython, Jython ve IronPython'da çalıştırın ve ne olduğunu görün. Bu, kodunuz hakkında size harika geri bildirimler verecektir. Bu Python3 için yararlı olmayabilir - son duydum, bazı uygulamalar hala Python2'deydi.

  • varsayımları ile ilgili açık, basit ve net bir kod yazın

  • modüler, oluşturulabilir kod yazma. Bazı kodların tehlikeli bir şey yapması gerekiyorsa (geleceğe yönelik anlamda), kodu değiştirmek zorunda olsa bile, kodun geri kalanı değişmeyecek şekilde ayırın.

  • bir formun spesifikasyonuna sahip olmak. Bu, spesifikasyon olarak testler kullanıyorsanız birim testleri hakkındaki noktalara ve spesifikasyon olarak da kullanılabilen arayüzlere benzer. (Genel anlamda arayüz, Java anahtar kelime anlamında değil).

Bunlardan herhangi birini yapmak, yapmanız gereken iş miktarını artırabilir / arttıracaktır. Bunun mantıklı olduğunu düşünüyorum - bu noktaların birçoğu iyi kod yazma konusunda da yapılabilir, ki bu oldukça zor (bence). Bazen bu önerilerin bazılarını ihlal etmeniz gerekebilir. Bu tamamen kabul edilebilir, ancak maliyetlerin farkında olun.

Python ekibinin bunu düşünmesi harika ve elbette benden çok daha yetenekli ve yetenekli. Yine de, bir yerlerde birinin kodunun Python yükseltildiğinde istenen şekilde çalışmayı bırakacağını% 100 tahmin ediyorum.


4

Buna Yapılandırma Yönetimi denir. Sistem asla değiştirilmezse, bozulmamalıdır. Yani sistemi değiştirmeyin. Yeni Python sürümlerinden endişe duyuyor musunuz? Yükseltme. Yeni aygıt sürücüleri hakkında endişeli misiniz? Yükseltme. Windows yamaları konusunda endişeli misiniz? ...


0

Python 2 -> Python 3 için önceden yüklenmiş bir Python 2to3 kütüphanesi vardır (orijinal Python paketi ile birlikte gelir).

Buna dayanarak, yeni sürümler yayınlandıktan hemen sonra, her yeni sürümle birlikte gelen benzer kütüphaneler olmalıdır. Bununla birlikte, Martijn'nin belirttiği gibi, bu tür kütüphaneler sadece büyük sürümler (sürüm 3.0 gibi) için yayınlanacak, küçük sürümler için (3.2 gibi) yayımlanmayacaktır. Bununla birlikte, 3.0 ve 3.2 (veya diğer küçük sürümler) arasında herhangi bir uyumluluk sorunu olmamalıdır, bu nedenle sürüm 3.0'a dönüştürme iyi olmalıdır.

Ayrıca, bu soruya bakmanızı öneririm .


1
Hayır, 2to3 yalnızca ana sürüm boşluğu boyunca kodu yükseltmenize yardımcı olur; küçük sürümler arasında kodu yükseltmek için kitaplık (gerekli) yoktur.
Martijn Pieters

@MartijnPieters Küçük sürümlerde uyumluluk sorunları olmamalı, çünkü aşırı büyük değişiklikler olmamalıdır. Uyumluluk sorunları ve büyük değişiklikler varsa, tamamen yeni bir sürüm yayınlanmalıdır.

0

Ekleyecek çok şeyim yok, "2 için program ve 2to3 kullan" son zamanlarda internet çevresinde yaygın bir eklenti gibi görünüyor. Ancak bakmanız gereken bir şey var:

Buna altı (pypi sayfası) denir . Bu hem python 2 hem de python 3 üzerinde çalışan kod yazmaya yardımcı olmak için ayrılmış bir python kütüphanesi.


Artik olduğum gibi değil. Soruyu düzenledim, umarım şimdi ne aradığım daha açıktır.
gerrit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.