Wim'in cevabının savunduğu stratejiye biraz ekleyeceğimi düşündüm - Django'nun uygun versiyonunu hem 2.7 hem de 3.x üzerinde çalıştıralım - ve benim için çalışan bazı taktikleri özetleyin .
Python 2.7, siz 3.x tetiği çekene kadar kaçış bölmenizdir
- testleriniz her ikisinde de çalışmalıdır
- f-dizeleri gibi 3.x'e özgü özellikleri kullanmayın
- önce Python 3.x, daha sonra 2.7'de çalışmayan Django 2.x
- erken başlayın, fazla analiz etmeyin, ama büyük patlama yaklaşımından kaçının
- önce dosya dosya.
- test paketleri içeren yardımcı program kitaplıkları gibi en düşük düzey koduyla başlayın.
- mümkünse, değişikliklerinizi yavaş yavaş 2.7 üretim dalında birleştirmeye çalışın ve 3.x taşıma kodunuzu ürün değişiklikleriyle güncel tutun.
Django'nun hangi küçük sürümünden başlamalı?
Buradaki kriterlerim, Django göçlerinin oldukça dahil olabileceğidir (ve aslında 2 => 3 işten daha fazla düşünmeyi gerektirir). Bu yüzden en son ve en büyük 1.11'e geçerek 2.7 kullanıcılarınıza bir miktar değer katmış olursunuz. Orada 1.11 önceden 2.x uyumluluk dolgularının iyi bir sayı muhtemelen ve onun 2.x kullanımdan kaldırılması uyarıları almak olacak.
Hangi küçük Python 3.x sürümü ile başlayalım?
Üçüncü taraf kitaplarınızın kullanılabilirliği, CI / devops paketinizden destek ve seçtiğiniz sunucu işletim sistemi görüntülerindeki kullanılabilirlik gibi tüm açıları göz önünde bulundurmak en iyisidir. Örneğin, her zaman 3.8 yükleyebilir ve gereksinimlerinizin bir pip yüklemesini deneyebilirsiniz.
Kaldıraç git (veya kullanmak SCM ne olursa olsun) ve Virtualenv .
- ayrı
requirement.txt
dosyalar, ancak ...
- Eğer bir dosya tabanlı, git repo varsa, her venv işaret edebilir aynı CodeLine bir ile
pip install -e <your directory>
. Bu, 2 farklı terminalde aynı birim test (ler) e karşı 2.7 ve 3.x çalıştırabileceğiniz anlamına gelir.
- 2.7 ve 3.x Django sunucularını farklı bağlantı noktalarında yan yana çalıştırabilir ve onlara Firefox ve Chrome diyebilirsiniz.
- sık sık (en azından taşıma dalında) ve git bisect hakkında bilgi edinin .
2to3 kullanmak
Evet, izin verirseniz 2.7 kodu ve Django kıracak. Yani...
önizleme modunda veya tek bir dosyada çalıştırın. neyin kırıldığını görün, aynı zamanda neyin doğru gittiğini de görün.
sadece belli dönüşümleri için gaz kelebeği yok 2.7 veya Django bölünürler. print x
=> print (x)
ve except(Exception) as e
2 beyinsizdir.
Kısılmış komutum şöyle görünüyordu:
2to3 $tgt -w -f except -f raise -f next -f funcattrs -f print
- emin oluncaya kadar dosyayı dosya çalıştırın.
toplu dönüşümler için düzenleyiciniz yerine sed veya awk kullanın .
Avantajı, uygulamalarınızın spesifik özelliklerinden daha fazla haberdar olduğunuzda, 1 dosya veya birçok dosyada çalıştırılabilecek bir değişiklik paketi oluşturabilir ve işin çoğunu 2.7 veya Django'yu bozmadan yapabilirsiniz. Bunu uygun şekilde kısılmış 2to3 geçişinizden sonra uygulayın . Bu sizi editörünüzde kalan temizliklerle ve testlerinizin geçmesini sağlar.
(isteğe bağlı) 2.7 kodda siyah çalışmaya başlar .
bir kod formatlayıcı olan siyah, analizini çalıştırmak için Python 3 AST kullanır. Kodu çalıştırmayı denemez, ancak AST aşamasına ulaşmasını engelleyen sözdizimi hatalarını işaretler. Ama oraya ulaşmak için bazı pip install global magic çalışmanız gerekecek ve siyahın kullanışlılığına satın almalısınız.
Diğer insanlar bunu yaptı - onlardan öğrenin.
Dinleme # 155 Python 3'e geçmek için pratik adımlar size iş hakkında bazı fikirler vermelidir. Bunun için şov bağlantılarına bakın. Ortak bir kod tabanında ve aynı git dalında tetikleyici çekiliş gününe kadar 2.7 kodun 3.x sözdizimine kademeli olarak ayarlanmasını içeren Instagram (?) Hareketini konuşmayı severler.
Ayrıca bkz . Muhafazakar Python 3 Taşıma Kılavuzu
ve Instagram Python 3'e Sorunsuz Hareket Ediyor - Yeni Yığın
Sonuç
Django 1.11 EOL (Nisan 2020) için zamanınız oldukça kısadır, bu nedenle atmak için 2+ dev kaynağınız varsa, aşağıdakileri paralel olarak yapmayı düşünürüm:
DEV # 1: 2.7 kullanarak bir Django 1.11 yumruğuna başlayın (teori, Django 1.11'in muhtemelen en iyi Django 2.x'e bir sıçrama noktası olarak konumlandırılmış olması).
DEV # 2: Django olmayan yardımcı program kodunuzun Python 3.6 / 3.7'sine başlayın. Kod bu noktada 2,7 uyumlu olduğundan, ilerlerken # 1 ile birleştirin.
Her iki görevin nasıl ilerlediğini görün, Django ile ilgili proje riskinin ne olduğunu ve Python 3 ağrısının neye benzediğini değerlendirin. Zaten Python 2.7 EOL'yi kaçırıyorsunuz, ancak eski bir web çerçevesi muhtemelen en azından birkaç ay boyunca eski Python 2.7'den daha tehlikelidir. Bu yüzden Django 1.9'dan taşınmaya başlamak için çok fazla beklemem ve yaptığınız iş boşa gitmeyecek. İlerlemeyi gördüğünüzde, proje risklerini daha iyi görmeye başlayacaksınız.
İlk 2'ye 3 ilerlemeniz yavaş olacak, ancak takım ve rehberlik hızlı bir şekilde hız alacaksınız, bu yüzden deneyim toplamaya başlamadan önce bunu düşünmeyin. Django tarafı bağlıdır senin ben erken başlamak en iyisi yüzden çerçevesinde kırılma değişikliklere maruz.
PS (tartışmalı / kişisel görüş) Altı veya diğer konserve 2-3 köprü kütüphanelerini fazla kullanmadım.
O var değil o 3. parti kütüphanelerini için parlak - - Ben güvenmiyorum çünkü daha ziyade bir kompleks kalıcı bağımlılık eklemek istemediğini (ve onun doc okumak için tembel oldu). Uzun süredir 3.x uyumlu sözdiziminde 2.7 kod yazıyordum, bu yüzden onları kullanma ihtiyacını gerçekten hissetmedim. Kilometreniz değişebilir ve çok fazla iş gibi görünüyorsa bu yola çıkmayın .
Bunun yerine, çoğu standart kütüphanede kullanımdan kaldırma ve ad değişiklikleri için geçici çözümlerle ilgilenen bu tür içerikle bir py223.py (57 LOC dahil yorumlar) oluşturdum.
try:
basestring_ = basestring
except (NameError,) as e:
basestring_ = str
try:
cmp_ = cmp
except (NameError,) as e:
# from http://portingguide.readthedocs.io/en/latest/comparisons.html
def cmp_(x, y):
"""
Replacement for built-in function cmp that was removed in Python 3
"""
return (x > y) - (x < y)
Ardından, bu özel endişeleri çözmek için bu py223'ten içe aktarın. Daha sonra I sadece ithalat hendek ve o garip hareket edecek isinstance(x, basestr_)
kadar isinstance(x, str)
ama yaklaşık endişe az var önceden biliyoruz.