Python'un sakıncaları nelerdir? [kapalı]


147

Python bugünlerde tüm öfke gibi gözüküyor ve haksız yere değil - çünkü gerçekten çözülmesi gereken yeni bir soruna sahip olmak gerçekten hoş bir dil. Ancak, bilge bir adamın bir zamanlar söylediği gibi (ona bilge bir adam diyerek, sadece kimin söylediğini bilmiyordum; o kadar akıllı olup olmadığından emin değilim), bir dili gerçekten tanımak sözdizimi, tasarım vb. avantajlar, aynı zamanda sakıncaları. Hiçbir dil mükemmel değildir, bazıları diğerlerinden daha iyidir.

Öyleyse, sizce ne olacak, Python'un nesnel sakıncaları.

Not: Burada bir dil karşılaştırması istemiyorum (yani C #, Python'dan daha iyidir çünkü ... yadda yadda yadda) - daha fazla hangi dil özelliklerinin kötü bir şekilde tasarlandığına dair bir objektif (bir seviyeye kadar) fikrinden daha fazlası bazılarınız içinde bu konuda eksiksiniz. Karşılaştırma için başka bir dil kullanması gerekiyorsa, ancak yalnızca aksi takdirde detaylandırılması zor olan bir noktayı göstermek için (yani anlama kolaylığı için)


50
Bunun yararlı bir öznel soru olduğunu düşünüyorum ve bunu kapatmak ayıp olur.
Eric Wilson

25
Burada, tüm python karşıtı cevapları düşüren bir piton fanatiği var.
zvrba

2
@TMN: Bu hala boşluklara belirteçler gibi davranıyor, sadece geri döndürmüyor - ve Python'un gramerinin yaptığı da aynı.

9
@Roger: SO konvansiyonu olumsuz oylara yorum yapmaktır. Bu öznel görüşler için bir site olduğu için , indirgemeye gerek yok, esp. yorum yapmadan. Bu yüzden "isim" sesleniyorum.
zvrba

8
@zvrba: Alt oylar hala her zaman olduğu gibi "kullanışlı değil" anlamına geliyor.

Yanıtlar:


109

Python'u düzenli olarak biraz kullanıyorum ve genel olarak çok iyi bir dil olduğunu düşünüyorum. Bununla birlikte, hiçbir dil mükemmel değildir. Şahsen benim için önem sırasına göre sakıncaları:

  1. Yavaş. Gerçekten çok yavaş demek istiyorum. Çoğu zaman bu önemli değil, ama kesinlikle performans açısından kritik olan bu bitler için başka bir dile ihtiyacınız olacak.

  2. İç içe geçmiş işlevler, dış kapsamdaki değişkenleri değiştiremeyeceğiniz için emilir. Düzenleme: Kütüphane desteği nedeniyle hala Python 2 kullanıyorum ve bu tasarım kusuru beni rahatsız ediyor, ancak görünüşe göre Python 3'te yerel olmayan bir açıklama nedeniyle düzeltildi . Kullandığım liblerin taşınmasını bekleyemem, böylece bu kusur tarihin kül yığınına gönderilebilir.

  3. Kütüphane / jenerik kod için faydalı olabilecek bazı özellikler eksik ve IMHO sağlıksız uç noktalara giden basitlik. Düşünebileceğim en önemlisi, kullanıcı tanımlı değer türleri (bunların metaclass magic ile oluşturulabileceğini tahmin ediyorum, ancak hiç denemedim) ve ref function parametresidir.

  4. Metalden uzak. Diş açma ilkellerini veya çekirdek kodunu yazmanız mı gerekiyor? İyi şanslar.

  5. Python'un sunduğu dinamizm için bir tradeoff olarak anlamsal hataları yakalama kabiliyetine aldırış etmemekle birlikte, kodu gerçekten çalıştırmak zorunda kalmadan sözdizimsel hataları ve saçma sapan değişkenler gibi aptalca şeyleri yakalamanın bir yolu olmasını diliyorum.

  6. Belgelendirme, güçlü kurumsal destekleri olan PHP ve Java gibi diller kadar iyi değildir.


60
@ Casey, aynı fikirde değilim. Dizin korkunçtur - withifadeye veya a ile ilgili yöntemlere bakmayı deneyin list. Eğitimde ele alınan herhangi bir şey temelde aranamaz durumdadır. Microsoft'un C ++ belgeleriyle ilgili çok daha fazla şansım var.
Mark Ransom

17
Yaklaşık 5 - sadece pyflakes kullanın. Bu hataları tam olarak yakalamak için yazılmıştır.
Alexander Solovyov

4
Hızla ilgili olarak: PyPy'nin yükselişiyle birçok Python kullanıcısı şimdi sadece JIT derleyicisine yerleştirilmiş bir tercüman kullanarak (şimdiye dek cpyext tarafından işlenmemiş Python 3 kullanıcıları ve C uzatma modüllerinin kullanıcıları ile) hız sorununu çözebilecekler. bu seçeneğe sahip değilsiniz).
ncoghlan

29
Python belgelerini küçümsüyorum. Emin olmaktan çok daha güzeller, ancak çoğu zaman çok sayıda yararlı bilgi dizgiler ve listelerdeki yöntemler gibi tek bir sayfada toplanıyor - ve tüm dizi türleri de birlikte toplanıyor. Bu bilgiyi ararken, sadece büyük bir toprağa inerim ve ne istediğimi bulmak için sayfayı aramalıyım. Ayrıca bu sayfalardaki dizini okunması zor buluyorum ve bazen hangi bölümü istediğimi söylemek zor.
Carson Myers,

5
Metalden uzaklık nasıl bir argüman olabilir? Python hiç bir zaman bir sistem dili olduğunu iddia etti mi?
Mark Canlas

66

Python'un bildirimi ve bir değişkenin kullanımı arasında ayrım yapamamasından nefret ediyorum. Bunun gerçekleşmesi için statik yazmaya gerek yoktur. “Bu kasıtlı olarak beyan ettiğim bir değişken ve yeni bir isim vermek niyetindeyim , bu bir yazım hatası değil ” demenin bir yolu olabilir .

Ayrıca, Python değişkenlerini genellikle bir kez yazma stilinde kullanırım, yani değişkenleri değişmez olarak görürüm ve bunları ilk görevlendirmelerinden sonra değiştirmem. Liste anlama gibi özellikler sayesinde, bu gerçekten inanılmaz derecede kolaydır ve kod akışının takip edilmesini daha kolay hale getirir.

Ancak bu gerçeği belgeleyemiyorum. Python'da hiçbir şey, üzerine yazma veya değişkenleri yeniden kullanma biçimimi engellemiyor.

Özetle, dilde iki anahtar kelimeye sahip olmak istiyorum: varve let. Bunlardan herhangi biri tarafından bildirilmeyen bir değişkene yazarsam, Python bir hataya neden olmalıdır. Ayrıca, letdeğişkenler salt okunurken, vardeğişkenler “normal” olarak bildirilir.

Bu örneği düşünün:

x = 42    # Error: Variable `x` undeclared

var x = 1 # OK: Declares `x` and assigns a value.
x = 42    # OK: `x` is declared and mutable.

var x = 2 # Error: Redeclaration of existing variable `x`

let y     # Error: Declaration of read-only variable `y` without value
let y = 5 # OK: Declares `y` as read-only and assigns a value.

y = 23    # Error: Variable `y` is read-only

Türlerin hala örtük olduğuna dikkat edin (ancak letdeğişkenler varhala dinamik bir şekilde yazılabilirken değişkenler yeni bir değere geri döndürülemeyeceklerinden statik olarak yazılmış tüm amaçlar ve amaçlar içindir ).

Son olarak, tüm yöntem argümanları otomatik olarak let, yani salt okunur olmalıdır. Genelde, aşağıdaki deyim dışında bir parametreyi değiştirmek için iyi bir neden yoktur:

def foo(bar = None):
    if bar == None: bar = [1, 2, 3]

Bu biraz farklı bir deyim ile değiştirilebilir:

def foo(bar = None):
    let mybar = bar or [1, 2, 3]

6
Keşke Python'un "var" ifadesi olsaydı. Belirttiğiniz (çok iyi) nedenin yanı sıra, kodu okumayı çok daha kolaylaştıracaktır, çünkü tüm değişken bildirimlerini görmek için sayfayı tarayabilirsiniz.
jhocking

25
Python geliştiricileri geçmişe ait dersleri görmezden geliyormuş gibi. Değişkenleri bildirmeme, işlevleri bildirmeme, ilk olarak 1950'lerde yapılan bir hatadır. Bulunması zor bir yazım hatası nedeniyle oluşan bu hataları bulmak zor ilk defa 1950'lerde yapıldı. Bu dil hatası tekrar tekrar ve tekrar ve tekrar yapıldı. Değişkenleri bildirmek büyük bir yük değildir. Kıçımı defalarca kurtardı. Kaçınılmaz olarak use strict;ve use warnings;her boyutta bir senaryoda perl olarak. Python, geliştiriciyi çok fazla hata ayıklama yardımcısından kurtardı.
David Hammen

19
@David, Python'a adil davranmak, atanmamış bir değişkene erişmeye çalışırsanız, bir istisna yaratacaktır. Bildirimi olmayan dillerin çoğu, bir tür varsayılan değer döndürür. Sonuç olarak, Python'un sürümü onlardan çok daha az sorunlu.
Winston Ewert

1
@yi_H Teklifin geriye dönük olarak uyumlu olması gerekmiyordu - hatta gerçek bir teklif. Asıl soru, “Python'un sakıncaları nedir”… peki, olmamak varve let(veya benzer bir mekanizma) bir dezavantaj. Başka bir deyişle: Python'un tasarımcısı olsaydım, böyle bir şey yapardım. Bununla birlikte , gelecek sürümlerde özel bir paket (buna benzer ) yüklediğinizde bunu içerebilir __future__. Söyle import strict. Bu gerçekleşmeyecek, çünkü sözdizimsel saldırılara ihtiyaç duyuyor…
Konrad Rudolph

3
+1 Daha iyi 'işlevsel benzeri' programlama yetenekleri eklemek için.
Evan Plaice

44

Asıl şikayetim, küresel tercüman kilidi (birçok "Python GIL'in İçi" konuşması).

Bununla birlikte, kullanımı çok kolay olan çok işlemli bir arayüz vardır, ancak aynı sayıda işlem ve iş parçacığı için bellek kullanımında daha ağır olacak veya çok fazla paylaşılan veriniz varsa zor olacaktır. Bununla birlikte, bunun yararı, birden fazla işlemle çalışan bir programınız olduğunda, birden çok makineye ölçeklenebilir, iş parçacıklı bir programın yapamayacağı bir şeydir.

Belgelerin eleştirisine gerçekten katılmıyorum, orada tüm ana dilleri olmasa da mükemmel ve daha iyi olduğunu düşünüyorum.

Ayrıca pylint çalıştıran çalışma zamanı hatalarının çoğunu yakalayabilirsiniz .


2
Pilin için +1. Farkında değildim. Bir dahaki sefere Python'da bir proje yaptığımda deneyeceğim. Ayrıca, eğer referans CPython uygulaması yerine Jython kullanıyorsanız, çoklu okuma iyi çalışıyor gibi görünüyor. OTOH Jython CPython'dan biraz daha yavaştır, bu nedenle bu amacı kısmen yenebilir.
dsimcha

3
Diş açma iyi desteklenmiyor mu? İş parçacığı kütüphaneleri 2.1'den beri oradaydı.
rox0r

2
İş parçacığı desteği olduğunu biliyorum, ancak Java ya da C ile karşılaştırıldığında GIL performansınızı gerçekten düşürecek. Çok işlemeli modülün diş açma yerine tercih edilmesinin nedeni budur.
cmcginty

2
Belgeleri bulmayı başarabiliyorsanız belgeler iyidir. Google Java sınıfları Python'dan çok daha kolaydır.
Brendan Long,

@Casey İplik desteklendiği için cevabın ifadesini açıklığa kavuşturdum, sadece bazı garip performanslar sergiledi (referans ekledi ve dokümanlara da birkaç bağlantı ekledi)
dbr

28

Muhtemelen , belli çalışma zamanı hataları sınıflarını ortaya çıkarabilen statik yazım eksikliği, ördek yazmanın sağladığı esnekliğe değmez.


5
Bu doğru, PyChecker gibi C / Java gibi dillerde bir derleyicinin hatalarını kontrol edebilen araçlar olmasına rağmen bu doğru.
Oliver Weiler

24
Dinamik yazma, bilinçli bir tasarım kararıdır, bir dezavantaj değildir.
missingfaktor

14
Java'nın zayıf yönünü söylemek, tipik yazı yazma eksikliğidir.
MAK

12
@missingfaktor, @MAK, açıkçası ördek yazarak amaçlanan bir özellikti. Ancak çoğu tasarım kararı objektif faydalar ve dezavantajlar getirmektedir. Eklenen kod esnekliği, dinamik yazmanın yararıdır ve olası çalışma zamanı hatalarının ek sınıfları bir dezavantajdır. Öznel kısım, özelliğin buna değip değmeyeceğidir.
Jacob,

6
Statik yazım eksikliği, programcıların çalışma zamanı hataları olan kod yazmasını kolaylaştırır . C # ' int foo = 4; Console.Write(foo.Length);da derlenmez, bu nedenle "Int32'nin uzunluğu Uzunluğu yoktur" hatası yanlışlıkla yayınlanmış yazılıma giremez. Python'da, böyle hataları aramak için isteğe bağlı ikincil araçları çalıştırmadığınız sürece, var olmayan nesne üyelerine erişen kod, çalışma zamanı hatalarına neden olana kadar tespit edilemeyebilir.
Yakup

27

Python'un nesne yönelimli kısımlarının bir çeşit "cıvatalanmış" olduğunu düşünüyorum. Açıkça açıkça her bir yönteme “kendini” geçirme ihtiyacı, OOP bileşeninin açıkça planlanmadığını belirten bir semptom ; Aynı zamanda Python'un başka bir cevapta eleştirilen bazen de sinsi kapsam belirleme kurallarını gösterir.

Düzenle:

Python'un nesne yönelimli kısımlarının "cıvatalanmış" olduğunu söylerken, OOP tarafının zaman zaman tutarsız hissettiğini kastediyorum. Örneğin, Ruby'yi alın: Ruby'de her şey bir nesnedir ve tanıdık obj.methodsözdizimini kullanarak (elbette aşırı yüklenmiş operatörler hariç) bir yöntem çağırırsınız ; Python'da her şey bir nesnedir, fakat bir işlev olarak çağırdığınız bazı yöntemler; yani, __len__bir uzunluk döndürmek için aşırı yüklüyorsunuz, ancak diğer dillerde len(obj)daha bilinen (ve tutarlı) yerine, onu kullanarak arayın obj.length. Bu tasarım kararının arkasında sebepler olduğunu biliyorum ama onlardan hoşlanmıyorum.

Ayrıca, Python'un OOP modeli her türlü veri korumasından yoksundur, yani özel, korumalı ve herkese açık üyeler yoktur; Onları kullanarak _ve __yöntemlerin önünde taklit edebilirsiniz , ama biraz çirkin. Benzer şekilde, Python da OOP’un mesaj gönderme yönünü tam olarak anlamadı.


17
Self parametresi yalnızca diğer dillerin ima ettiği şeyleri açıkça belirtmektedir . Bu diller açıkça bir "öz" parametresine sahiptir.

13
@Roger Pate: Evet, ama bu “öz” için açık bir ihtiyaç, can sıkıcı bir durum (ve tartışmalı, sızdıran bir soyutlama). Ayrıca, kasıtlı bir tasarım kararı olarak da ortaya çıkmadı, ancak Python'un "garip" kapsam belirleme kuralları nedeniyle. Makaleyi hızlı bir şekilde bulamıyorum, ancak "öz" parametresinin neden gerekli olduğunu güzel bir şekilde açıklayan Guido van Rossum'dan bir e-posta gönderme var.
mipadi

2
@Roger Pate: Nesne yönelimli dillerde, hedefi ilk parametre olarak geçmek hala bir uygulama detayı olarak düşünülebilir. Benim açımdan, bunun iyi bir fikir olup olmadığı değil; nokta Python, bu olmasıdır değil bilinçli tasarım kararı nedeniyle değil, kapsam sisteminde siğil etrafında çalışmak.
mipadi

3
@mipadi: Güncellemenin daha iyi bir nedeni var (bu yüzden aşağı oyu kaldıracağım), ancak eğer len'i aşırı yüklediğiniz bir operatör olarak görüyorsanız, Python'da daha fazla OO olur. Python'un mesajların nasıl yanlış iletildiğine dair bir örnek veya akıl yürütmeyi görmek isterim.

8
Açık benlik, yöntemlerin sadece işlevler olduğu gerçeğinin bir ürünüdür (Winston'un da belirttiği gibi, yerel değişken bildirimlerini içerir). Bu tasarım kararını beğenmediniz , ancak çalışma zamanında her şeyin bir nesne olarak erişilebilir olduğu bir dilde OOP'yi "cıvatalı" olarak çağırmak aptalca.
ncoghlan

19

Python hakkında sevmediğim şeyler:

  1. Threading (Daha önce de bahsedildiğini biliyorum, ancak her yazıda bahsetmeye değer).
  2. Çok satırlı adsız işlevler için destek yok ( lambdayalnızca bir ifade içerebilir).
  3. (Gibi basit ama güçlü giriş okuma fonksiyonu / sınıfın olmaması cinveya scanfC ++ ve C veya ScannerJava).
  4. Tüm dizeler varsayılan olarak unicode değildir (ancak Python 3'te sabitlenmiştir).

5
(2) ile ilgili olarak, bunun iç içe geçmiş fonksiyonlara sahip olma ihtimaliyle dengelendiğini düşünüyorum.
Konrad Rudolph

3
@KonradRudolph Çok hatlı lambdalar yerine iç içe geçmiş fonksiyonlara sahip olduğum ana nitelik, okuma sırasının değişmesidir.
CookieOfFortune

2
@ wkschwartz: raw_inputve 'sys.stdin' güzel barebones. Biçimlendirilmiş girdi almayı desteklemiyorlar (örneğin, zaman içinde okumak için "% d:% d:% d"% (saat, dakika, sn) gibi bir şey). Şimdiye kadar Python, scanf (C) veya Scanner (Java) işlevselliğine yaklaşan hiçbir şeye sahip değildir.
MAK

2
@ limcoder: Java'da tüm dizeler varsayılan olarak unicode'dur. Ayrı str ve unicode sınıflarına sahip olmak için iyi bir neden görmüyorum. IMHO, dizeleri ve bayt diziler gerektiğini değil aynı soyutlama ile temsil edilebilir. Bir dize sınıfı, dahili temsilini gerçekten umursamadığımız metni depolamak ve işlemek için olmalıdır. Bir dize içindeki belirli bir baytta truncate / replace / delete / insert gibi şeyler yapmak istememeliyiz - bunu belirli bir karakterde yapmak istiyoruz . İngilizceden olmayan bir girdiyi beslediğinizde ayrımı unutmak ve kodunuzu patlatmak kolaydır.
MAK

1
@ limscoder: Eğer kolay unicode görmek istiyorsanız, Tcl'yi deneyin. Birkaç yıl önce Tcl'den Python'a geçmek zorunda kaldım ve ilkel python'un unicode desteğinin kıyaslamada olmasına şaşırdım. Gerçekten Tcl'de görünmez ve pitonda büyük bir acı.
Bryan Oakley

18

Değişken veri türleriyle varsayılan argümanlar.

def foo(a, L = []):
    L.append(a)
    print L

>>> foo(1)
[1]
>>> foo(2)
[1, 2]

Genellikle bazı ince böceklerin sonucudur. Varsayılan bir argüman gerektiğinde (her işlev çağrısı için kullanılacak tek bir nesne oluşturmak yerine) yeni bir liste nesnesi oluşturması daha iyi olacağını düşünüyorum.

Düzenleme: Çok büyük bir sorun değil, ancak bir şey belgelerde belirtilmesi gerektiğinde, bu genellikle bir sorun olduğu anlamına gelir. Bu gerekli olmamalı.

def foo(a, L = None):
    if L is None:
        L = []
    ...

Özellikle de bunun varsayılan olması gerektiğinde. Beklediğinizle eşleşmeyen ve çok sayıda koşul için kullanışlı olmayan garip bir davranış.


Bununla ilgili pek çok şikayet görüyorum, ancak insanlar neden varsayılan bir argüman olarak boş bir listeye (işlev değiştirir) sahip olmakta ısrar ediyorlar? Bu gerçekten büyük bir problem mi? Yani, bu gerçek bir problem mi?
Martin Vilcans

8
En az sürpriz ilkesini ihlal ediyor. Bir işlevin parametrelerinin çağrılar arasında hayatta kalmasını beklemiyor.
aib

Bu bir betik dili olmasının bir sonucudur. Sadece bir kez bu böcek tarafından stumped olacak ve bir daha asla. Kendin için bu hatayı bulmak, sana gerçekten de bir betik dili olduğunu hatırlatmak için popoda bir vuruş veriyor. Ve bunun nedeni, dilin komut dosyası özelliğini gizlemede iyi olmasından kaynaklanıyor (doğru kullandığınızı varsayarak).
Zoran Pavlovic

@ ZoranPavlovic meraktan, neden bu bir betik dili olmasının bir sonucu? Verilerin sınırlandırılması ve listelerin değişken olması nedeniyle (normalde iyi olan, ancak bir araya getirildiğinde kötü olan iki şey olan) değişken olduğu için bir sorun gibi görünüyor. Aynı sorun, işlev her çağrıldığında yeni bir liste oluşturmak yerine, işlev oluşturma sırasında verileri bağlarsanız, komut dosyası olmayan bir dilde olabilir.
jsternberg

@aib: Sanmıyorum - buradaki parametre, diğer tüm Python nesneleri gibi - bir nesneye işaretçidir. Bu durumda, nesne değişkendir ve işlev bildirildiğinde değişken bağlanır. Parametre "çağrılar arasında hayatta kalır", fakat hayatta kalan değişken bir nesneye referanstır.
Patrick Collins,

14

Python'un bir geliştirme dili kadar esnek kılan özelliklerinden bazıları, C ++ ve Java gibi dillerde derleme ve bağlantı işlemi tarafından yürütülen "tüm program" statik analizinde kullanılanların büyük dezavantajları olarak da görülüyor.

  • Yerel değişkenlerin örtük beyanı

Yerel değişkenler normal atama bildirimi kullanılarak bildirilir. Bu, başka herhangi bir kapsamdaki değişken bağlamaların, derleyici tarafından alınacak açık ek açıklamalar gerektirdiği anlamına gelir (dış kapsamlar için genel ve yerel olmayan bildirimler, örneğin kapsamlar için erişim erişimi gösterimi). Bu, programlama sırasında ihtiyaç duyulan kazan plakası miktarını büyük ölçüde azaltır, ancak derleyicinin açık değişken bildirimleri gerektiren dillerde işlenen kontrolleri yapmak için üçüncü taraf statik analiz araçlarına (pyflakes gibi) ihtiyaç duyulduğu anlamına gelir.

  • "Maymun yama" desteklenir

Modüllerin içeriği, sınıf nesneleri ve hatta yerleşik ad alanı çalışma zamanında değiştirilebilir. Bu oldukça güçlüdür ve birçok yararlı tekniğe izin verir. Ancak, bu esneklik Python'un statik olarak yazılmış OO dilleri için ortak bazı özellikler sunmadığı anlamına gelir. En önemlisi, örnek metotlara "self" parametresi dolaylı olmaktan ziyade açıktır ("metotlar" bir sınıf içinde tanımlanması gerekmediğinden, sınıf değiştirilerek daha sonra eklenebilir, yani özellikle pratik değildir. Örnek referansını dolaylı olarak iletmek için) ve nitelik erişim kontrolleri, kodun sınıfın "içinde" veya "dışında" olup olmadığına (kolayca sınıf tanımı yürütülürken var olduğu için) dayalı olarak uygulanamaz.

  • Metalden uzak

Bu, diğer birçok yüksek seviye dil için de geçerlidir, ancak Python çoğu donanım detayını soyutlama eğilimindedir. C ve C ++ gibi sistem programlama dilleri, doğrudan donanım erişimini ele almak için hala çok daha uygundur (ancak, Python, CPython eklenti modülleri veya daha kolay bir şekilde ctypeskütüphane yoluyla olanlarla oldukça mutlu bir şekilde konuşacaktır ).


12
  1. Her ne olursa olsun, {} / begin-end yerine kod blokları için girinti kullanmak.
  2. Her yeni modern dilin kendine özgü bir kapsamı vardır, ancak Python'u yoktur (aşağıya bakınız).
  3. Kaotik dokümanlar (mükemmel olan Perl5 belgeleriyle karşılaştırın).
  4. Boğaz-ceket (bunu yapmanın tek bir yolu var).

Kırık kapsam için örnek; tercüman oturumundan konuşma metni:

>>> x=0
>>> def f():
...     x+=3
...     print x
... 
>>> f()
Traceback (most recent call last):
  File "", line 1, in ?
  File "", line 2, in f
UnboundLocalError: local variable 'x' referenced before assignment

globalve nonlocalbu tasarım aptallığını düzeltmek için anahtar kelimeler tanıtıldı.


2
kapsam belirleme ile ilgili olarak, mevcut yöntemin gerekçesini anlamak için python.org/dev/peps/pep-3104 adresini incelemek meraklı olabilir .
Winston Ewert

+1 ile aynı fikirde. Yani, +1.
Jas

34
Bunu yapmanın bir yolu olması bir avantajdır. Başkasının kodunu okuduğunuzda hiç tek bir ifadeyi deşifre edemezsiniz. Deyimler beyninize bağlandıktan sonra, anında tanımanız gerekir.
rox0r

9
@ Rox0r ile tamamen aynı fikirdeyim. "Düz ceket" her türlü sözdizimi savaşını engeller.
keithjgrant

8
Dürüst olmak gerekirse, Python'daki globalveya nonlocalanahtar kelimelere nadiren ihtiyacım var . Nadiren bu sorunun var olduğunu unutuyorum ve her gün işyerinde Python kodunu yazmış olmama rağmen, ortaya çıktıkça birkaç kez tekrar go-go. Bana göre, global değişkenleri (veya daha kötüsü, global olmayan dış değişkenleri) değiştirmesi gereken kod, bir kod kokusudur. Genellikle (her zaman değil) daha iyi bir yol vardır.
Ben

11

Python'un nesne yönelimli this.method()ve yordamsal / işlevsel method(this)sözdizimi kombinasyonunu çok rahatsız edici buluyorum :

x = [0, 1, 2, 3, 4]
x.count(1)
len(x)
any(x)
x.reverse()
reversed(x)
x.sort()
sorted(x)

Bu özellikle kötüdür, çünkü çok sayıda işlev (yöntemlerden ziyade) yalnızca küresel ad alanına dökülür : listeler, dizeler, sayılar, yapıcılar, metaprogramlama, hepsi alfabetik olarak sıralanmış büyük bir listede karıştırılmıştır.

En azından, F # gibi işlevsel diller, tüm işlevlerin modüllerde düzgün bir şekilde adlandırılmış:

List.map(x)
List.reversed(x)
List.any(x)

Yani hepsi birlikte değil. Ayrıca, bu kütüphane boyunca takip edilen bir standarttır, bu yüzden en azından tutarlı.

İşlev vs yöntem şeyini yapmanın nedenlerini anlıyorum ama hala bunları bu şekilde karıştırmanın kötü bir fikir olduğunu düşünüyorum. En azından ortak işlemler için yöntem sözdizimini izlerseniz çok daha mutlu olurum:

x.count(1)
x.len()
x.any()
x.reverse()
x.reversed()
x.sort()
x.sorted()

Yöntemlerin değişip değişmediği, nesnede yöntem olarak kullanılmasının çeşitli avantajları vardır:

  • Veri türündeki "genel" işlemleri aramak için tek yer: diğer kütüphaneler / etc. veri türlerine yapabilecekleri başka süslü şeyler de olabilir, ancak "varsayılan" işlemlerin tümü nesnenin yöntemlerindedir.
  • ModuleArarken tekrarlamaya gerek yok Module.method(x). Yukarıdaki işlevsel Liste örneğini alırsak, neden sürekli tekrar tekrar söylemem Listgerekiyor? Bunun bir olduğunu bilmeli Listve Navigation.map()üzerinde bu fonksiyonu çağırmak istemiyorum ! x.map()Sözdizimini kullanmak onu KURU ve tutarsız tutar.

Ve elbette , bunu yapmanın herşeyi küresel isim alanına yerleştirme yöntemine göre avantajları var. Şu anki yolun işleri halledemediği bir şey değil. len(lst)Hiçbir şey isim alanı olmadığından, oldukça hoş ( ) bile var ! İşlevleri (varsayılan davranış vb.) Yöntemlerde kullanmanın avantajlarını biliyorum, ancak yine de hoşuma gitmiyor.

Sadece dağınık. Ve büyük projelerde, dağınıklık en büyük düşmanınızdır.


1
evet ... LINQ stilini gerçekten çok özlüyorum (eminim ki LINQ bunu uygulayan ilk kişi değil, ama en çok aşina oluyorum) liste işleme.
CookieOfFortune

1
Len (x) yöntemini düşünmeyin. "len" bir fonksiyondur. Python'un fonksiyonları ve yöntemleri var ve bu yaklaşımda yanlış bir şey görmüyorum. Uygun fonksiyonların eksikliği genellikle, çok fazla gereksiz yazmanın kaynağıdır.
rbanffy

Biliyorum len()bir fonksiyon ve avantajların ne olduğunu. Ayrıca bunun neden kötü bir fikir olduğunu düşündüğümü, neden küresel işlevlerin özellikle de kötü bir fikir olduğunu düşündüğümü ve yöntemlerin neden işlevselliğinizi düzenlemenin ve kapsamlaştırmanın uygun bir yöntem sağladığını düşünüyorum =)
Haoyi

42 (veya 43?) Anahtar kelimelerin 'büyük' ​​bir sayı olduğunu sanmıyorum. Bu da gibi şeyleri içerir def, classve diğer non-fonksiyon çağrıları. Diğer popüler dillerde 100+ ile karşılaştırın. Ayrıca, gelen çizgi düşünün import this: Namespaces are one honking great idea -- let's do more of those!. Python ad alanlarını yanlış anlayabileceğinizi düşünüyorum;)
Wayne Werner

8

Homoconicity eksikliği .

Python, "with" anahtar kelimesini eklemek için 3.x beklemek zorunda kaldı. Herhangi bir homoikonik dilde, önemsizce bir kütüphaneye eklenmiş olabilir.

Cevaplarında gördüğüm diğer birçok konu 3 tipten biri:

1) Takımla sabitlenebilecek şeyler (örn. Pyflakes) 2) Uygulama detayları (GIL, performans) 3) Kodlama standartlarıyla sabitlenebilecek şeyler (örn. İnsanların orada olmasını istemeyen özellikler)

# 2 dil ile ilgili bir sorun değil, IMO # 1 ve # 3 ciddi bir sorun değil.


1
withPython 2.5 ile mevcuttu from __future__ import with_statement, ancak katılıyorum, bazen if/ for/ print/ etc gibi ifadelerin normal fonksiyonlar yerine "özel" olduğunu talihsiz buldum
dbr

7

Python, çok etkileyici olduğu için en sevdiğim dildir, ancak yine de sizi çok fazla hata yapmaktan alıkoyuyor. Hala beni rahatsız eden birkaç şey var:

  • Gerçek anonim işlev yok. Lambda, tek ifadeli işlevler için kullanılabilir ve withifade, Ruby'de bir kod bloğu kullanacağınız birçok şey için kullanılabilir. Ancak bazı durumlarda, işleri olması gerekenden biraz daha sakar yapar. (Java’da olduğu kadar sakar olmaktan uzak, ama yine de ...)

  • Modüller ve dosyalar arasındaki ilişkide bazı karışıklıklar. Komut satırından "python foo.py" çalıştırmak "import foo" dan farklıdır. Python 2.x içindeki göreceli ithalat da sorunlara neden olabilir. Yine de Python'un modülleri, C, C ++ ve Ruby'nin ilgili özelliklerinden çok daha iyidir.

  • Açık self. Bunun nedenlerinden bazılarını anladığım halde, her gün Python kullanmama rağmen, onu unutma hatası yapma eğilimindeyim. Bununla ilgili bir başka sorun da, bir sınıfı bir sınıftan çıkarmak için biraz can sıkıcı hale gelmesidir. Açık kişisel, başkalarının şikayet ettiği sınırlı kapsamla ilgilidir. Python'daki en küçük kapsam, fonksiyon kapsamıdır. İşlevlerinizi gerektiği gibi küçük tutarsanız, bu başlı başına bir sorun değildir ve IMO genellikle daha temiz kodlar verir.

  • lenBir yöntem olmayı beklediğiniz gibi bazı küresel işlevler (gerçekte perde arkasında olduğu gibi).

  • Önemli girinti. Düşüncenin kendisi değil, bence harika, ama bu kadar çok insanı Python'u denemekten alıkoyan tek şey olduğundan, belki de Python bazı (isteğe bağlı) başlangıç ​​/ bitiş sembolleriyle daha iyi olurdu. Bu insanları görmezden geldiğimde, çentik için de zorunlu bir büyüklükte yaşayabilirim.

  • Bunun, JavaScript yerine, web tarayıcılarının yerleşik dili olmadığıdır.

Bu şikayetler arasında, dile ilk eklediğim, dile eklenmesi gerektiğini düşünüyorum. Diğerleri, sonuncusu hariç, oldukça küçüktür, eğer gerçekleşirse harika olurdu!


+1 datetime.datetime.now()Bir projenin ne zaman yazıp yazamayacağını yazıp yazmamayı merak ediyorum datetime.nowve sonra iki projeyi bir şekilde yazmanın bir yolunu diğerine hükmediyor ve kesinlikle Java'da bir dosya adıyla aynı olmayan bir modüle isim vermeyecekti. (?) Genel yolun, her iki kullanım da uygulandığında ve dosya açıkken modülün bizi dosya ile karıştırdığını görüyorsanız self, çağrılar işlevlerle aynı sayıda argümana sahip olmadığından hala anlamaya çalışıyorum. Ve VM pitonunun yavaş olduğunu düşünebilirsin?
Niklas Rosencrantz

Açık kendi kendine anahtar kelime ile sorununuzla ilgili. Bunun için iyi bir python IDE kullanmanızı önerebilir miyim? Eclipse'deki PyDev'in bir sınıfın içine yazdığınızı algılarsa işlev imzasının kendi bölümünü otomatik olarak tamamladığını biliyorum.
Zoran Pavlovic

5

Python tam olarak olgun değildir: şu anda python 3.2 dili şu anda dağıtılan paketlerin çoğuyla uyumluluk sorunları yaşamaktadır (genellikle python 2.5 ile uyumludur). Bu, şu anda daha fazla geliştirme çabası gerektiren büyük bir dezavantajdır (gereken paketi bulun; uyumluluğu doğrulayın; daha uyumlu olabilecek iyi olmayan bir paket seçmeyi tartın; en iyi sürümü alın, günler alabilecek 3.2'ye güncelleyin; yararlı bir şey yapmaya başla).

Muhtemelen 2012'nin ortalarında bu bir dezavantajı daha az olacaktır.

Sanırım bir hayran çocuk tarafından reddedildi. Bir geliştirici tartışması sırasında, üst düzey geliştirici ekibimiz aynı sonuca vardı.

Bir ana anlamda vade, bir ekibin teknolojiyi kullanabileceği ve gizli riskler olmadan (uyumluluk sorunları dahil) çok hızlı bir şekilde çalışmaya ve koşmaya başlayabileceği anlamına gelir. 3. parti python paketleri ve birçok uygulama, bugün paketlerin çoğunluğu için 3.2'nin altında çalışmaz. Bu, eldeki sorunu çözmek yerine teknolojinin kendisini yeniden uygulayarak daha fazla entegrasyon, test çalışmaları, == daha az olgun teknoloji yaratır.

Haziran 2013 Güncellemesi: Python 3'ün hala vade sorunları var. Sık sık bir ekip üyesi gereken bir paketten bahseder ve sonra "sadece 2.6 dışındadır" deyin (bu durumlarda bazı durumlarda 2.6 ile yalnızca 2.6 olan paketi kullanmak için localhost soketi aracılığıyla bir geçici çözüm uyguladım. araçlarımız 3.2. Python 3'te saf piton wiki MoinMoin bile yazılmaz.


2
Yalnızca vade tanımınız tasarımla uyumlu olmayan bir sürümle uyumlu değilse, size katılıyorum .
tshepang

3
Python'un iki uyumsuz akışının bir sorun olduğuna katılıyorum (neden yapıldığı anlaşılabilir olmasına rağmen), ancak bunu “olgunluk” meselesi olarak görmüyorum.
Winston Ewert,

Bir anlamda vade, bir ekibin teknolojiyi kullanabileceği ve gizli riskler olmadan (uyumluluk sorunları dahil) çok hızlı bir şekilde çalışmaya başlayabileceği anlamına gelir. 3. parti python paketleri ve birçok uygulama, bugün paketlerin çoğunluğu için 3.2'nin altında çalışmaz. Bu, eldeki sorunu çözmek yerine teknolojinin kendisini yeniden uygulayarak daha fazla entegrasyon, test etme, == daha az olgun teknoloji çalışması yaratır.
Jonathan Cline IEEE

2
O zaman sadece Python 2.x kullanın. Bilirsin ... herkesin kullandığı versiyon. Veya hangi sürümlerle uyumlu olduğunu bulmak için paket belgelerini 2 saniye boyunca okuyun.
jsternberg

2
“Python 3.0 bir süredir piyasaya sürülmüş olması, kullanmanız gereken sürümü anlamına gelmiyor. Python 3.0 ve 2.x aynı anda geliştiriliyor. Gelecekte hepimizin kullanabileceğini umuyorum. python 3.0, ancak şimdilik 2.x kullanmak iyi bir çözüm "-> 500 karakter demenin bir yolu: Henüz olgun değil.
Jonathan Cline IEEE

4

Python'un kapsamı çok bozuk; Python'da nesne yönelimli programlama çok garip.


8
bir örnek verebilir misin? (Haklı olduğunuza eminim, ama bir örnek istiyorum)
Winston Ewert

24
Python'u severim ama kesinlikle bir exampleself. özelliği ve yöntemine yapılan her referansın önüne koymak zorunda kalıyorum . Ruby'de yapmak çok kolay bir DSL oluşturmak için Python'u kullanmak imkansız hale geliyor.
Adam Crossland

35
Kendini garip bulmuyorum, açıklığı seviyorum.
Winston Ewert,

9
Açık benlikle ilgili en önemli şeyin ne olduğunu anlamıyorum. C ++, Java ve D'de insanlar genellikle herhangi bir şekilde örneğin alt çizgi ile önek ekleyerek konvansiyonel olarak üye değişkenlerini açık yaparlar.
dsimcha

7
Kendini, bildirimlerinden farklı yöntemlerde kullanırsınız: def foo (self) ama self.foo (). Bu açık tanım karışımını buluyorum ancak perde arkasındaki şeyleri çok hoş değil.
LennyProgramcılar

4

Python ile ilgili düşüncelerim:

  • Civatalı OOP (Bu konuda ayrıntılı bilgi için @ mipadi'nin cevabına bakınız)
  • Lambdaların kırık uygulaması
  • Kapsam sorunları
  • Standart kütüphanede kalıcı koleksiyon yok
  • Katıştırılmış DSL'lerde zayıf özellik

Neden aşağı oy?
kaybolan

Ben indirici değilim, ama OO'nun neden cıvatalandığını düşündüğünüzü açıklayabilir misiniz? Python her zaman OO'ya sahipti, dilin temel bir parçası.
Daenyth,

@ Mipadi'nin cevabına bakınız.
missingfaktor


4

Python'daki erişim değiştiricileri zorunlu değildir - iyi yapılandırılmış, modüler kod yazmayı zorlaştırır.

Sanırım bu @ Mason'un kırılmış kapsamının bir parçası - genel olarak bu dilde büyük bir sorun. Okunması gereken kod için, kapsamın içinde neyin olabileceğini ve olması gerektiğini ve herhangi bir zamanda bir değerin ne olacağını anlamak oldukça zor görünüyor - Şu anda bu dezavantajlar nedeniyle Python dilinden geçmeyi düşünüyorum .

Sırf "hepimiz yetişkinlere izin veriyoruz" demek, hatalar yapmadığımız ve güçlü bir yapı içinde daha iyi çalışmadığımız anlamına gelmez, özellikle karmaşık projeler üzerinde çalışırken - girinti ve anlamsız alt çizgi yeterli görünmüyor .


Yani erişim kontrolü eksikliği kötü ... ama değişken olmayan herhangi bir yerel isim alanına açıkça yazılması da kötü mü?
ncoghlan

@ncoghlan: 1 - Bu özellik, projenizi nasıl yapılandırdığınıza bağlı olarak birçok modern dilde standarttır. 2-Programcının kontrolünde. 3 - Bu konuda neyin harika olduğundan emin değilsiniz - kapsamınızı çoğu derlenmiş dilde / IDE'de birkaç proje ayarıyla kolayca kontrol edebilirsiniz. 'Hepimiz yetişkinlere izin veriyoruz' ise, kendi kararlarımızı verebilmeli ve kapsamı özel rahatlık seviyemize göre ayarlayabilmeliyiz.
Vektör

2
Mesele şu ki, "zorunlu erişim kontrolleri" isteyen insanlar, Python'u bu kadar iyi bir yapıştırıcı dili yapan şeylerden birini çıkarmamızı istiyorlar: geliştiricilerin kodlarının daha sonra nasıl kullanılacağını kontrol etmeleri kasıtlı olarak zor . C ++ ve Java modellerinde kazan plakasının ne kadarı yalnızca zorunlu erişim kontrollerinin etrafında çalışacak? Kesinlikle bu nedenlerle Python'u kullanmamayı seçen insanları anlayabiliyorum, ancak statik uygulama asla zorlu testlerin yerine geçmeyecek.
ncoghlan

1
@ncoghlan - bana göre Python ile ilgili en güzel şeyler, sentaksın ve özlülüğün zarafetidir - ifade. Ve dediğim gibi, kapsam belirleme, programcıların kod yapısı ve organizasyonu ile yapmamasından daha fazla olması gereken şeylerle uğraşmakla daha az ilgisi var. Basit projeler ve senaryolar yerine karmaşık projeler üzerinde çalışıyorum - kodun dikkatlice modüler hale getirilmesi ve yapılandırılması gerekiyor - erişim değiştiricileri bunu sağlamanın en önemli yollarından biri.
Vektör

1
Kod inceleme, eğitim ve eşleştirme analizi diğerleridir. Bana göre zorla erişim kontrolleri, statik tipleme ile aynı kepçe içine düşüyor: doğruluk konusunda bazı ek güven sağlamaya yardımcı oluyor (ancak kapsamlı test gereksinimini önlemek için yeterli değil), ancak geliştirme verimliliğinde yüksek bir maliyetle. (Pratik düzeyde, sınıf niteliği erişim denetimleri, yöntemlerin yalnızca sınıflardan elde edilen sıradan işlevler olduğu Python'un nesne modeline de uymaz. Sınıflar için "iç / dış" sınırı gerçekten yoktur, bu yüzden olamaz uygulamalı)
ncoghlan

3
  1. Performans iyi değil ama pypy ile gelişti
  2. GIL, kodu hızlandırmak için iş parçacığı kullanımını engeller (bu genellikle erken bir optimizasyon olmasına rağmen),
  3. Yalnızca uygulama programlaması için kullanışlıdır,

Ancak bazı harika kullanım özelliklerine sahiptir:

  1. RAD için mükemmel
  2. C ile arabirim kurmak kolaydır (ve C için bir python yorumlayıcısı yerleştirmek için),
  3. Çok okunabilir
  4. Öğrenmesi kolay,
  5. İyi belgelenmiştir,
  6. Piller gerçekten dahil edilmiş, standart kütüphanesi çok büyük ve pypi hemen hemen her şey için modüller içeriyor
  7. Sağlıklı bir topluma sahiptir.

Avantajlardan bahsetmek için nelerden ilham alındı? Sorunlar için soru. Her neyse, ne demek sadece uygulama programlaması için faydalı? Başka hangi programlama var? Özellikle ne için iyi değil?
tshepang

5
Avantajları sıraladım çünkü eksilerin ağır basacağını düşünüyorum. Daha önce python'da bir linux çekirdek modülü kurmayı denedin mi?
dan_waterworth

3

Python'u tercih ediyorum ve aklıma gelen ilk dezavantaj, o zamanki gibi bir ifadeyi yorumladığınızda if myTest():, C veya Java ile yapmak zorunda kalmayacağınız tüm yürütülen bloğun girintisini değiştirmeniz gerekiyor. Aslında python'da if-cümlesi yerine yorum yapmak yerine bu şekilde yorum yapmaya başladım: `eğer True: #myTest () bu yüzden aşağıdaki kod bloğunu da değiştirmek zorunda kalmayacağım. Java ve C girintiliğe güvenmediğinden, C ve Java ile ifadeleri yorumlamayı kolaylaştırır.


1
Girintisini değiştirmeden bir kodun blok seviyesini değiştirmek için C veya Java kodunu ciddi bir şekilde düzenler misiniz?
Ben

4
@Ben Geçici olarak, evet ...
alternatif

1
@ ben burada aynı.
Christopher Mahan

2
Ben değişen hile kullanmak if something()için if False and something(). Diğer bir püf noktası çok satırlı bir dize kullanarak "yorumlamak".
Martin Vilcans

1
@Martin Kursu! eğer Yanlışsa ...
Christopher Mahan

3

Çoklu gönderim, kurulan tek gönderim tipi sistemle iyi bir şekilde bütünleşmiyor ve çok iyi performans göstermiyor.

Dinamik yükleme, POSIX benzeri anlambilimin meta veri yoğun işlemler için yıkıcı yavaşlamalara neden olduğu paralel dosya sistemlerinde büyük bir sorundur. Çeyrek milyon çekirdek saatini harcayan meslektaşlarım sadece Python'u (numpy, mpi4py, petsc4py ve diğer eklenti modülleriyle birlikte) 65k çekirdeğe yükledi. (Simülasyon önemli yeni bir bilim sonuçları verdi, bu yüzden buna değdi, ama Python'u bir kez yüklemek için bir varilden daha fazla petrolün yakılması bir problemdi.) Statik olarak bağlanamama bizi zorlu çarpıtmaya girmeye zorladı dlopenToplu dosya sistemi erişimini sağlamak için libc-rtld düzeltme ekini de dahil olmak üzere ölçekte makul yükleme süreleri .


Vay, çok teknik görünüyor, konuyla ilgili herhangi bir referans materyalin, örneğin, blog yazısı veya makaleniz var mı? Yakın bir zamanda bu tür davalara maruz kalabilir miyim merak ediyorum.
vincent

Aron , SciPy 2012'de bir konuşma yaptı . dlopenŞeyler bizim içindedir collfs kütüphanede. Bu depo ayrıca Asher Langton'ın önbelleklemesinden esinlenilen ilave zipimport hileleri içeriyor. Daha iyi dağıtım ve bir kağıt üzerinde çalışıyoruz.
Jed,

3
  • oldukça yaygın kullanılan 3. parti kütüphanelerden ve yazılımlardan oluşan bir grup oldukça pitonik değildir. Birkaç örnek: soaplib, openerp, reportlab. Eleştiri kapsam dışıdır, oradadır, yaygın olarak kullanılır, ancak piton kültürünü kafa karıştırıcı kılar (“Bir tane olmalı — ve tercihen sadece bir - bunu yapmanın açık bir yolu” yazan sloganı incitir). Bilinen pitonik başarılar (örneğin django veya trac) istisna gibi görünüyor.
  • potansiyel olarak sınırsız soyutlama derinliği örneği, sınıf, metaclass kavramsal olarak güzel ve benzersiz. Ancak, ustalaşmak için tercümanı derinden tanımanız gerekir (hangi sırada python kodunun yorumlandığı vs.). Yaygın olarak bilinmez ve kullanılmaz (ya da doğru kullanılırsa), C # generics gibi benzer kara büyü, kavramsal olarak daha karmaşıktır (IMHO) orantılı olarak daha yaygın olarak bilinir ve kullanılır.
  • bellek ve iş parçacığı modelini iyi anlamak için, python konusunda oldukça deneyimli olmalısınız, çünkü kapsamlı bir özellik yok. Sadece neyin işe yaradığını biliyorsunuzdur, belki tercümanın kaynaklarını veya deneyimli tuhaflıkları okuduğunuz ve nasıl düzelteceğinizi keşfettiğiniz için. Örneğin, java'nın yumuşak ve hayali referansları değil, yalnızca güçlü veya zayıf referanslar vardır. Java'nın çöp toplama işlemi için bir iş parçacığı varken, çöp toplamanın pythonda ne zaman gerçekleştiğine ilişkin resmi bir cevap yoktur; Eğer hiçbir python kodu çalıştırılmazsa, çöp toplama işleminin gerçekleşmeyeceğini gözlemleyebilir ve muhtemelen bellek ayırmaya çalışırken bazen bunun gerçekleştiğine karar verebilirsiniz. Kilitlenmiş bir kaynağın neden serbest bırakılmadığını bilmediğinizde zor olabilir (bu konudaki deneyimim freeswitch'teki mod_python idi).

Her neyse, python 4 yıldır ana dilim. Düşkün olmak, seçkinler veya monomanyaklar piton kültürünün bir parçası değil.


+1. Hafıza ve iş parçacığı modeli için spec doğru. Ancak FWIW, Java çöp toplayıcısı bir iş parçacığında (ve GC ile ilgili diğer her şeyde) Java dilinin ya da VM spesifikasyonlarının bir yönü değil, belirli bir JVM uygulamasının bir konusudur. Ancak, ana Sun / Oracle JVM, JVM ayarında yayınlanan tüm kitapların bulunduğu ölçüde, GC davranışı ve yapılandırılabilirliği ile kapsamlı bir şekilde belgelenmiştir. Teoride biri, dilin özelliğinden bağımsız olarak CPython'u aynı şekilde belgeleyebilir.
Andrew Janke

2
  • Garip OOP:
    • len(s)yoluyla __len__(self)ve diğer "özel yöntemler"
    • Diğer özel yöntemlerle elde edilebilecek çok özel bir yöntem ( __add__ve __iadd__için +ve +=)
    • self ilk yöntem parametresi olarak
    • temel sınıf kurucusunu aramayı unutabilirsiniz
    • erişim değiştiricileri yok (özel, korumalı ...)
  • sabit tanım yok
  • Özel tipler için değişkenlik yok
  • GIL
  • Python ve C'nin bir karışımına yol açan ve yapımlarla ilgili sorunlara neden olan düşük performans (C kütüphaneleri, platform bağımlılıkları aranıyor ...)
  • özellikle üçüncü şahıs kütüphanelerinde kötü dokümantasyon
  • Python 2.x ve 3.x arasındaki uyumsuzluk
  • zayıf kod analiz araçları (Java veya C # gibi statik olarak yazılmış diller için sunulanlarla karşılaştırıldığında)

5
Şahsen, 2.x ile 3.x arasındaki uyumsuzluğun Python'un en büyük avantajlarından biri olduğunu düşünüyorum. Elbette, aynı zamanda bir dezavantaj. Ancak, geliştiricilerin geriye dönük uyumluluğu kırma konusundaki ciddiyeti, aynı zamanda sonsuz bir hamle yapmak zorunda olmadıkları anlamına da geliyor. Daha fazla dilde bu tür bir revizyon gerekir.
Konrad Rudolph

0

“Taklit edilebilirlik” tam olarak güçlü bir nokta değil. AFAIK sayıları, harfleri ve karakterleri değişmez, diğer her şey (yani nesneler) değişkendir. Bunu, her şeyin değişmez olduğu Erlang veya Haskell gibi işlevsel dillerle karşılaştırın (varsayılan olarak, en azından).

Bununla birlikte, dokunulmazlık gerçekten de Python'un güçlü noktası olmayan eşzamanlılık * ile parlıyor, bu yüzden en azından sonuçta ortaya çıkıyor.

(* = Nitpickers için: En azından kısmen paralel olan eşzamanlılığı kastediyorum. Python'un değişmezliğin o kadar önemli olmadığı "tek iş parçacıklı" eşzamanlılıkla tamam olduğunu düşünüyorum. eşzamanlılık olmadan bile harika.))


0

Açıkça paralel yapılara sahip olmayı çok isterdim. Sık sık, çoğu gibi bir liste anlayışı yazarken

[ f(x) for x in lots_of_sx ]

Elemanların işleneceği sırayı umursamıyorum. Bazen, hangi sırayla iade edildiklerini bile umursamıyorum.

Fp saf Python iken CPython bunu iyi yapmasa bile, bunun gibi diğer uygulamaların kullanması için davranışlar tanımlanabilir.


// spawn thread iplikleri // pass tüm sıralara sıradaki kuyruğu que.extend ([x lot_of_sx içindeki x için x]) que.wait () # Bütün lot_of_sx dizilerinin işlenmesini bekleyin.
Zoran Pavlovic

0

Python'un çoğunlukla felsefi sebeplerden dolayı kuyruk çağrısı optimizasyonu yoktur . Bu, büyük yapılardaki kuyruk özyinelemesinin O (n) belleğe mal olabileceği anlamına gelir (tutulan gereksiz yığın nedeniyle) ve özyinelemeyi O (1) belleği elde etmek için bir döngü olarak yeniden yazmanızı gerektirir.

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.