पायथन की कमियां क्या हैं? [बन्द है]


147

पाइथन इन दिनों सभी गुस्से में है, और अवांछनीय रूप से नहीं - क्योंकि यह वास्तव में एक ऐसी भाषा है जिसके साथ एक को हल करने के लिए एक नई समस्या दी जा रही है। लेकिन, जैसा कि एक बुद्धिमान व्यक्ति ने एक बार कहा था ( केवल एक बुद्धिमान व्यक्ति को बुलाकर, क्योंकि मुझे इस बारे में कोई विचार नहीं है कि वास्तव में किसने कहा है; यह निश्चित नहीं है कि क्या वह उस समय समझदार था), वास्तव में एक भाषा को जानने के लिए केवल इसका ही पता नहीं है सिंटैक्स, डिज़ाइन, आदि, फायदे लेकिन इसकी कमियां भी। कोई भी भाषा परिपूर्ण नहीं है, कुछ अन्य की तुलना में बेहतर हैं।

तो, आपकी राय में क्या होगा, पायथन के उद्देश्य कमियां।

नोट: मैं यहाँ एक भाषा तुलना के लिए नहीं कह रहा हूँ (यानी C # पायथन से बेहतर है क्योंकि ... yadda yadda yadda) - एक उद्देश्य का (कुछ स्तर तक) राय जो भाषा सुविधाओं को बुरी तरह से डिज़ाइन किया गया है, क्या हो सकता है कुछ आप इसे और इतने पर याद कर रहे हैं। यदि तुलना के रूप में किसी अन्य भाषा का उपयोग करना चाहिए, लेकिन केवल एक बिंदु को चित्रित करने के लिए जो अन्यथा पर विस्तृत करना मुश्किल होगा (यानी आसानी के लिए)


50
मुझे लगता है कि यह एक उपयोगी व्यक्तिपरक प्रश्न है, और इसे बंद करना शर्म की बात होगी।
एरिक विल्सन

25
यहाँ एक अजगर-फैनबॉय लगता है जो बस सभी एंटी-पाइथन जवाबों को नीचा दिखाता है।
zvrba

2
@ टीएमएन: यह अभी भी व्हॉट्सएप को टोकन के रूप में मान रहा है, बस उन्हें वापस नहीं लौटा रहा है - और यह बिल्कुल वही है जो पायथन का व्याकरण भी करता है।

9
@रोगर: एसओ पर अधिवेशन नीचे टिप्पणी करने के लिए है। चूँकि यह व्यक्तिपरक राय के लिए एक साइट है , इसलिए मुझे डाउनवोट्स, एस्प के लिए कोई कारण नहीं दिख रहा है। w / ओ टिप्पणी। इसलिए, मैं अपने "नाम-कॉलिंग" के साथ खड़ा हूं।
zvrba

8
@ ज़र्बा: डाउनवोट्स का मतलब अभी भी "उपयोगी नहीं" है, हमेशा की तरह।

जवाबों:


109

मैं पायथन का उपयोग कुछ हद तक नियमित रूप से करता हूं, और कुल मिलाकर मैं इसे बहुत अच्छी भाषा मानता हूं। बहरहाल, कोई भी भाषा परिपूर्ण नहीं है। व्यक्तिगत रूप से मेरे लिए महत्व के क्रम में कमियां इस प्रकार हैं:

  1. ये धीमा है। मेरा वास्तव में मतलब है, वास्तव में धीमा। बहुत बार यह मायने नहीं रखता है, लेकिन इसका निश्चित रूप से मतलब है कि आपको उन प्रदर्शन-महत्वपूर्ण बिट्स के लिए एक और भाषा की आवश्यकता होगी।

  2. नेस्टेड फ़ंक्शंस चूसना इस प्रकार है कि आप बाहरी दायरे में चर को संशोधित नहीं कर सकते। संपादित करें: मैं अभी भी पुस्तकालय समर्थन के कारण अजगर 2 का उपयोग करता हूं, और यह डिजाइन दोष मुझे बाहर निकालने के लिए परेशान करता है, लेकिन जाहिर तौर पर यह पायथन 3 में गैर- बयान के कारण तय किया गया है । मेरे द्वारा उपयोग किए जाने वाले कामों का इंतजार नहीं किया जा सकता है, इसलिए इस दोष को अच्छे के लिए इतिहास के राख ढेर में भेजा जा सकता है।

  3. यह कुछ सुविधाओं को याद कर रहा है जो लाइब्रेरी / जेनेरिक कोड के लिए उपयोगी हो सकता है और IMHO सरलता से अस्वस्थ चरम सीमा तक ले जाया जाता है। सबसे महत्वपूर्ण मैं सोच सकता हूं कि उपयोगकर्ता-परिभाषित मूल्य प्रकार हैं (मैं अनुमान लगा रहा हूं कि यह मेटाक्लस जादू के साथ बनाया जा सकता है, लेकिन मैंने कभी कोशिश नहीं की है), और फ़ंक्शन पैरामीटर को परिष्कृत करें।

  4. यह धातु से दूर है। सूत्रण प्रधानता या कर्नेल कोड या कुछ लिखने की आवश्यकता है? सौभाग्य।

  5. जबकि मैं पायथन की पेशकश की गतिशीलता के लिए एक व्यापार के रूप में सामने आने वाली शब्दार्थ त्रुटियों को पकड़ने की क्षमता की कमी को बुरा नहीं मानता, मैं चाहता हूं कि वाक्यविन्यास त्रुटियों को पकड़ने का एक तरीका था और वास्तव में कोड चलाने के बिना चर नामों को गलत तरीके से समझने जैसी मूर्खतापूर्ण चीजें थीं।

  6. प्रलेखन PHP और जावा जैसी भाषाओं के रूप में अच्छा नहीं है जिसमें मजबूत कॉर्पोरेट समर्थन हैं।


60
@ कैसी, मुझे असहमत होना है। सूचकांक भयानक है - withकथन, या विधियों को देखने की कोशिश करें list। ट्यूटोरियल में शामिल कुछ भी मूल रूप से उपलब्ध नहीं है। मेरे पास C ++ के लिए Microsoft के प्रलेखन के साथ बहुत बेहतर किस्मत है।
मार्क रैनसम

17
5 के बारे में - बस pyflakes का उपयोग करें। यह बिल्कुल उन त्रुटियों को पकड़ने के लिए लिखा गया है।
अलेक्जेंडर सोलोवोव

4
गति के बारे में: PyPy के उदय के साथ, कई पायथन उपयोगकर्ता अब JIT- कम्पाइलर में निर्मित (अब के लिए, पायथन 3 उपयोगकर्ताओं और C एक्सटेंशन लाइन के उपयोगकर्ताओं को cpyext द्वारा नियंत्रित किया जाता है) के साथ एक दुभाषिया का उपयोग करके गति की समस्या को संभाल सकेंगे। यह विकल्प नहीं है)।
ncoghlan

29
मैं अजगर डॉक्स को तुच्छ समझता हूं। वे निश्चित होने के लिए पहले से ही बेहतर हैं, लेकिन कई बार बहुत सी उपयोगी जानकारी एक पृष्ठ में लटकाई जाती है, जैसे स्ट्रिंग्स और सूचियों पर तरीके - और सभी अनुक्रम प्रकार एक साथ ही लंप किए जाते हैं। जब मैं इस जानकारी को खोजता हूं, तो मैं बस एक विशाल ठुमके पर उतरता हूं, और जो मुझे चाहिए उसे खोजने के लिए पृष्ठ को नीचे खोजना होगा। मुझे इन पृष्ठों पर सूचकांक को पढ़ना मुश्किल लगता है, और कभी-कभी यह बताना मुश्किल होता है कि मुझे कौन सा अनुभाग चाहिए।
कार्सन मायर्स

5
धातु से दूरी तर्क कैसे हो सकती है? क्या पायथन ने कभी सिस्टम भाषा होने के लिए खुद को शुद्ध किया?
मार्क कैनल

66

मुझे लगता है कि अजगर एक चर की घोषणा और उपयोग के बीच अंतर नहीं कर सकता। ऐसा करने के लिए आपको स्थिर टाइपिंग की आवश्यकता नहीं है। यह कहने का एक तरीका अच्छा होगा "यह एक चर है जिसे मैं जानबूझकर घोषित करता हूं, और मैं एक नया नाम पेश करने का इरादा रखता हूं , यह एक टाइपो नहीं है"।

इसके अलावा, मैं आमतौर पर पाइथन वेरिएबल्स का उपयोग राइट-वन स्टाइल में करता हूं, यानी, मैं वैरिएबल को अपरिवर्तनीय मानता हूं और उनके पहले असाइनमेंट के बाद उन्हें संशोधित नहीं करता। सूची समझ जैसी सुविधाओं के लिए धन्यवाद, यह वास्तव में अविश्वसनीय रूप से आसान है और कोड प्रवाह का पालन करना अधिक आसान बनाता है।

हालाँकि, मैं उस तथ्य का दस्तावेज नहीं दे सकता। पाइथन में कुछ भी मुझे ओवरराइटिंग या वैरिएबल का पुन: उपयोग करने से रोकता है।

सारांश में, मैं भाषा में दो खोजशब्द रखना चाहूँगा: varऔर let। यदि मैं उन दोनों में से किसी एक चर को नहीं घोषित करता हूं, तो पायथन को एक त्रुटि उठानी चाहिए। इसके अलावा, letचर को केवल-पढ़ने के लिए घोषित करता है, जबकि varचर "सामान्य" हैं।

इस उदाहरण पर विचार करें:

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

ध्यान दें कि प्रकार अभी भी अंतर्निहित हैं (लेकिन letचर सभी इरादों और उद्देश्यों के लिए सांख्यिकीय रूप से टाइप किए गए हैं क्योंकि वे एक नए मूल्य पर पलटाव नहीं कर सकते हैं, जबकि varचर अभी भी गतिशील रूप से टाइप किए जा सकते हैं)।

अंत में, सभी विधि तर्क स्वचालित रूप से होने चाहिए let, अर्थात उन्हें केवल-पढ़ा जाना चाहिए। निम्नलिखित मुहावरे को छोड़कर किसी पैरामीटर को संशोधित करने के लिए सामान्य रूप से कोई अच्छा कारण नहीं है:

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

इसे थोड़ा अलग मुहावरे से बदला जा सकता है:

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

6
मैं चाहता हूं कि पाइथन का "वर्जन" बयान था। इसके अलावा (बहुत अच्छा) कारण आप बताते हैं, इससे कोड को पढ़ना भी बहुत आसान हो जाएगा क्योंकि तब आप सभी चर घोषणाओं को प्राप्त करने के लिए पृष्ठ पर स्कैन कर सकते हैं।
jhocking

25
यह ऐसा है जैसे अजगर डेवलपर्स ने अतीत के सबक को नजरअंदाज कर दिया है। वेरिएबल घोषित नहीं करना, फ़ंक्शन घोषित नहीं करना, 1950 के दशक में पहली बार की गई गलती है। उन मुश्किलों को खोजने के लिए जो एक कठिन स्पॉट स्पॉटो से उत्पन्न हुए थे, वे आश्चर्यजनक रूप से 1950 के दशक में पहली बार बने थे। यह भाषा गलती (और बाद में सही) समय और फिर से की गई है। चरों को घोषित करना बहुत बड़ा बोझ नहीं है। इसने कई बार मेरे बट को बचाया है। मैं अनिवार्य रूप से use strict;और use warnings;पर्ल में किसी भी आकार की स्क्रिप्ट पर। अजगर ने कई डिबगिंग एड्स के विकासकर्ता को छीन लिया है।
डेविड हैमेन

19
@ डेविड, अजगर के लिए उचित होने के लिए, यह एक अपवाद को बढ़ाएगा यदि आप एक चर का उपयोग करने की कोशिश करते हैं जिसे नहीं सौंपा गया है। जिन भाषाओं में घोषणाओं की कमी है, उनमें से कुछ डिफ़ॉल्ट मान लौटाएंगी। नतीजतन, पायथन का संस्करण उन लोगों की तुलना में बहुत कम समस्याग्रस्त है।
विंस्टन इर्वर्ट

1
@yi_H प्रस्ताव पीछे की ओर संगत नहीं था - या यहां तक ​​कि एक वास्तविक प्रस्ताव भी। सवाल था, "पायथन की कमियां क्या हैं" ... ठीक है, नहीं है varऔर let(या एक समान तंत्र) एक खामी है। अलग तरह से रखो: मैं अजगर का डिज़ाइनर था, मैंने ऐसा कुछ किया होगा। जैसा कि कहा गया , भविष्य के संस्करणों सकता है जब आप एक विशेष पैकेज (के समान लोड इस में शामिल हैं __future__)। , कहो import strict। हालांकि ऐसा नहीं होगा, क्योंकि इसके लिए सिंटैक्टिकल हैक्स की आवश्यकता होती है ...
कोनराड रूडोल्फ

3
+1 बेहतर 'कार्यात्मक जैसी' प्रोग्रामिंग क्षमताओं को जोड़ने के लिए।
इवान प्लाइस

44

मेरी मुख्य शिकायत फैल रही है, जो वैश्विक दुभाषिया लॉक के कारण कई परिस्थितियों (जावा, सी और अन्य की तुलना में) के रूप में प्रदर्शन नहीं कर रही है ( "पायथन जीआईएल के अंदर देखें " (पीडीएफ लिंक) बात)

हालाँकि, एक मल्टीप्रोसेस इंटरफ़ेस है जो उपयोग करने में बहुत आसान है, हालाँकि यह समान प्रक्रियाओं बनाम थ्रेड्स के लिए मेमोरी उपयोग पर भारी पड़ने वाला है, या यदि आपके पास बहुत सा साझा डेटा है तो मुश्किल है। हालांकि, लाभ यह है कि एक बार जब आपके पास कई प्रक्रियाओं के साथ काम करने का कार्यक्रम होता है, तो यह कई मशीनों के पार हो सकता है, कुछ एक थ्रेडेड प्रोग्राम नहीं कर सकता है।

मैं वास्तव में प्रलेखन की आलोचना पर असहमत हूं, मुझे लगता है कि यह सबसे अच्छा और बेहतर है अगर सभी प्रमुख भाषाएँ नहीं हैं।

इसके अलावा आप कई रनटाइम बग को पाइलिंट चलाने के लिए पकड़ सकते हैं ।


2
Pylint के लिए +1। मैं इससे अनजान था। अगली बार जब मैं पायथन में एक प्रोजेक्ट करूँगा, तो मैं इसे आज़माऊँगा। इसके अलावा, मल्टीथ्रेडिंग ठीक काम करने लगती है यदि आप संदर्भ CPython कार्यान्वयन के बजाय Jython का उपयोग करते हैं। ओटोह जाइथन सीपीथॉन की तुलना में कुछ धीमा है, इसलिए यह आंशिक रूप से उद्देश्य को हरा सकता है।
dsimcha

3
थ्रेडिंग अच्छी तरह से समर्थित नहीं है? थ्रेडिंग लाइब्रेरी 2.1 से पहले से वहां हैं।
rox0r

2
मुझे पता है कि थ्रेडिंग समर्थन है, लेकिन जावा या सी की तुलना में, जीआईएल वास्तव में आपके प्रदर्शन को कम करेगा। यही कारण है कि मल्टीप्रोसेसिंग मॉड्यूल को थ्रेडिंग पर पसंद किया जाता है।
cmcginty

2
प्रलेखन अच्छा है यदि आप इसे खोजने के लिए प्रबंधन कर सकते हैं। पायथन की तुलना में जावा कक्षाओं को गुगुल करना बहुत आसान है।
ब्रेंडन लॉन्ग

@ कैसी ने जवाब में शब्दों को स्पष्ट किया है, क्योंकि थ्रेडिंग का समर्थन किया गया है, बस कुछ अजीब प्रदर्शन (डॉक्स में एक संदर्भ और कुछ लिंक भी
जोड़े गए

28

यकीनन , स्टैटिक टाइपिंग की कमी, जो रनटाइम त्रुटियों के कुछ वर्गों को पेश कर सकती है, अतिरिक्त लचीलेपन के लायक नहीं है जो बतख टाइपिंग प्रदान करता है।


5
यह सही है, हालांकि PyChecker जैसे उपकरण हैं जो सी / जावा जैसी भाषाओं में संकलक की त्रुटियों की जांच कर सकते हैं।
ओलिवर वीलर

24
डायनामिक टाइपिंग एक सचेत डिजाइन निर्णय है, न कि एक खामी।
लापता

14
जावा की कमजोरी को डायनामिक टाइपिंग की कमी कहा जाता है।
मैक

12
@missingfaktor, @MAK, जाहिर है बतख टाइपिंग एक इच्छित विशेषता थी। लेकिन अधिकांश डिजाइन निर्णय उद्देश्य लाभ और कमियां पेश करते हैं। जोड़ा कोड लचीलापन गतिशील टाइपिंग का एक लाभ है, और संभावित रनटाइम त्रुटियों की अतिरिक्त कक्षाएं एक खामी है। व्यक्तिपरक हिस्सा यह है कि क्या सुविधा इसके लायक है।
जैकब

6
स्टैटिक टाइपिंग की कमी से प्रोग्रामर के लिए कोड लिखना आसान हो जाता है जिसमें रनटाइम एरर होता है। C # में, int foo = 4; Console.Write(foo.Length);संकलन नहीं करता है, इसलिए "Int32 में संपत्ति की लंबाई नहीं है" त्रुटि गलती से प्रकाशित सॉफ़्टवेयर में अपना रास्ता नहीं बना सकती है। अजगर में, जब तक आप उस तरह की त्रुटियों को देखने के लिए वैकल्पिक माध्यमिक उपकरण नहीं चलाते हैं, तब तक कोड जो वस्तुओं के गैर-मौजूदा सदस्यों तक पहुंचता है, वह तब तक चल सकता है जब तक कि यह रनटाइम त्रुटियों का कारण नहीं बनता।
याकूब

27

मुझे लगता है कि पायथन के ऑब्जेक्ट-ओरिएंटेड पार्ट्स "बोल्ट पर" की तरह महसूस होते हैं। पूरी तरह से हर विधि को "स्व" पास करने की पूरी आवश्यकता एक लक्षण है जो कि ओओपी घटक है यह स्पष्ट रूप से योजनाबद्ध नहीं था , आप कह सकते हैं; यह पायथन के कभी-कभी घिनौने नियमों को भी दिखाता है जिसकी आलोचना दूसरे जवाब में की गई थी।

संपादित करें:

जब मैं कहता हूं कि पायथन के ऑब्जेक्ट-ओरिएंटेड पार्ट्स "बोल्टेड" महसूस करते हैं, तो मेरा मतलब है कि कई बार, ओओपी पक्ष असंगत महसूस करता है। उदाहरण के लिए, रूबी को लें: रूबी में, सब कुछ एक वस्तु है, और आप परिचित obj.methodसिंटैक्स का उपयोग करके एक विधि कहते हैं (ओवरलोड ऑपरेटरों के अपवाद के साथ, निश्चित रूप से); पायथन में, सब कुछ एक वस्तु है, भी, लेकिन कुछ तरीके जिन्हें आप फ़ंक्शन के रूप में कहते हैं; यानी, आप __len__एक लंबाई वापस करने के लिए अधिभार लगाते हैं , लेकिन इसे अन्य भाषाओं में len(obj)अधिक परिचित (और सुसंगत) obj.lengthआम के बजाय उपयोग करके कॉल करते हैं। मुझे पता है कि इस डिज़ाइन निर्णय के पीछे कारण हैं, लेकिन मैं उन्हें पसंद नहीं करता।

साथ ही, पायथन के ओओपी मॉडल में किसी भी प्रकार के डेटा संरक्षण का अभाव है, अर्थात, निजी, संरक्षित और सार्वजनिक सदस्य नहीं हैं; आप उनका उपयोग करके _और __विधियों के सामने नकल कर सकते हैं , लेकिन यह बदसूरत है। इसी तरह, पायथन को OOP का संदेश-पास करने का अधिकार बिलकुल नहीं मिलता।


17
स्वयं पैरामीटर केवल स्पष्ट कर रहा है कि अन्य भाषाएं क्या निहित हैं। उन भाषाओं में स्पष्ट रूप से एक "स्व" पैरामीटर है।

13
@ रॉजर पटे: हाँ, लेकिन "स्व" की स्पष्ट आवश्यकता कष्टप्रद है (और, मैं तर्क करूंगा, एक टपका हुआ अमूर्त)। यह एक जानबूझकर डिजाइन निर्णय के रूप में भी नहीं आया, लेकिन पायथन के "अजीब" स्कूपिंग नियमों के कारण। मुझे लेख जल्दी से नहीं मिल रहा है, लेकिन गुइडो वैन रोसुम से एक ईमेल पोस्टिंग है जो अच्छी तरह से समझाती है कि "स्वयं" पैरामीटर की आवश्यकता क्यों है।
मियादी

2
@ रॉजर पाट: ऑब्जेक्ट-ओरिएंटेड भाषाओं में, पहले पैरामीटर के रूप में लक्ष्य को पारित करना अभी भी एक कार्यान्वयन विवरण माना जा सकता है। हालांकि, मेरी बात यह नहीं है कि यह एक अच्छा विचार है या नहीं; मुद्दा यह है कि पायथन में, यह एक सचेत डिजाइन निर्णय के कारण नहीं है , बल्कि स्कूपिंग सिस्टम में मौसा के आसपास काम करने के लिए है।
मियादी

3
@mipadi: अपडेट का बेहतर तर्क है (इसलिए मैं डाउनवोट हटा दूंगा), लेकिन अगर आप लेन को एक ऑपरेटर के रूप में देखते हैं , जिसे आप ओवरलोड करते हैं, तो यह पायथन में अधिक OO है। एक उदाहरण देखना पसंद करेंगे या इस पर तर्क देंगे कि पायथन संदेश-गलत कैसे हो जाता है।

8
स्पष्ट स्व इस तथ्य का एक उदहारण है कि विधियाँ केवल कार्य हैं (और, जैसा कि विंस्टन ने उल्लेख किया है, स्थानीय चर घोषणाओं का उल्लेख है)। आप उस डिज़ाइन निर्णय को पसंद नहीं करने के लिए स्वतंत्र हैं , लेकिन OOP को उस भाषा में "bolted" कहते हैं जहां सब कुछ एक वस्तु के रूप में सुलभ है, जो रनटाइम पर एक वस्तु है।
ncoghlan

19

चीजें जो मुझे पायथन के बारे में पसंद नहीं हैं:

  1. थ्रेडिंग (मुझे पता है कि इसका उल्लेख पहले ही किया जा चुका है, लेकिन हर पोस्ट में उल्लेख के लायक है)।
  2. मल्टी-लाइन अनाम कार्यों के लिए कोई समर्थन नहीं है ( lambdaकेवल एक अभिव्यक्ति हो सकती है)।
  3. एक साधारण लेकिन शक्तिशाली इनपुट रीडिंग फंक्शन / क्लास (जैसे cinया scanfC ++ और C या Scannerजावा में) का अभाव ।
  4. सभी तार डिफ़ॉल्ट रूप से यूनिकोड नहीं हैं (लेकिन पायथन 3 में तय किए गए हैं)।

5
(2) के बारे में, मुझे लगता है कि यह नेस्टेड फ़ंक्शन होने की संभावना से ऑफसेट है।
कोनराड रुडोल्फ

3
@KonradRudolph मल्टी-लाइन लैंबडास के बजाय नेस्टेड फ़ंक्शन के साथ मेरा मुख्य गुण रीडिंग ऑर्डर स्वैप हो जाता है।
CookieOfFortune

2
@wkschwartz: raw_inputऔर 'sys.stdin' काफी नंगे हैं। वे प्रारूपित इनपुट प्राप्त करने का समर्थन नहीं करते हैं (उदाहरण के लिए "% d:% d:% d"% (घंटे, मिनट, सेकंड) जैसे कुछ समय में पढ़ने के लिए)। अब तक पायथन में स्कैनफ (सी) या स्कैनर (जावा) की कार्यक्षमता के करीब कुछ भी नहीं है।
मेक

2
@Healthcoder: सभी तार जावा में डिफ़ॉल्ट रूप से यूनिकोड हैं। मुझे अलग-अलग str और यूनिकोड वर्गों के लिए एक अच्छा कारण नहीं दिखता है। IMHO, स्ट्रिंग्स और बाइट्स के सरणियों को एक ही अमूर्त द्वारा दर्शाया नहीं जाना चाहिए । एक स्ट्रिंग कक्षा को पाठ के भंडारण और हेरफेर के लिए होना चाहिए - जिसका आंतरिक प्रतिनिधित्व हम वास्तव में परवाह नहीं करते हैं। हमें एक स्ट्रिंग में किसी विशिष्ट बाइट में ट्रंकट / रिप्लेसमेंट / डिलीट / इंसर्ट जैसी चीजें नहीं करनी चाहिए - हम यह एक विशिष्ट चरित्र में करना चाहते हैं । इसके भेद को भूलना आसान है और गैर-अंग्रेजी इनपुट मिलने पर आपके कोड को उड़ा दिया जाता है।
MAK

1
@ कामचोर: यदि आप आसान यूनिकोड देखना चाहते हैं, तो Tcl आज़माएं। मुझे कुछ साल पहले Tcl से Python में स्विच करना पड़ा था, और लड़का मुझे इस बात पर आश्चर्य हुआ था कि कैसे आदिम अजगर का यूनिकोड समर्थन तुलना में है। यह वास्तव में Tcl में अदृश्य है, और अजगर में एक प्रमुख दर्द है।
ब्रायन ओकले

18

परिवर्तनशील डेटा प्रकारों के साथ डिफ़ॉल्ट तर्क।

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

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

यह आमतौर पर कुछ सूक्ष्म कीड़े का परिणाम है। मुझे लगता है कि यह बेहतर होगा यदि यह एक नई सूची ऑब्जेक्ट बनाए जब भी एक डिफ़ॉल्ट तर्क की आवश्यकता थी (बजाय प्रत्येक सूची के लिए उपयोग करने के लिए एक एकल ऑब्जेक्ट बनाने के लिए)।

संपादित करें: यह एक बहुत बड़ी समस्या नहीं है, लेकिन जब किसी चीज़ को डॉक्स में संदर्भित करने की आवश्यकता होती है, तो आमतौर पर इसका मतलब है कि यह एक समस्या है। इसकी आवश्यकता नहीं होनी चाहिए।

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

खासकर जब वह डिफ़ॉल्ट होना चाहिए था। यह सिर्फ एक अजीब व्यवहार है जो आपकी अपेक्षा के अनुरूप नहीं है और बड़ी संख्या में परिस्थितियों के लिए उपयोगी नहीं है।


मुझे इस बारे में बहुत सारी शिकायतें दिखाई देती हैं, लेकिन लोग एक खाली सूची (जो फ़ंक्शन को संशोधित करता है) को डिफ़ॉल्ट तर्क के रूप में क्यों जोर देते हैं? क्या यह वास्तव में इतनी बड़ी समस्या है? यानी, क्या यह वास्तविक समस्या है?
मार्टिन विलकंस

8
यह कम से कम आश्चर्य के सिद्धांत का उल्लंघन करता है। कोई फ़ंक्शन के मापदंडों को कॉल में जीवित रहने की उम्मीद नहीं करेगा।
ऐब

यह एक पटकथा भाषा होने का परिणाम है। आप इस बग ONCE से केवल स्टम्प्ड होंगे, और फिर कभी नहीं। अपने लिए इस बग का पता लगाना वास्तव में आपको यह याद दिलाने के लिए बट में एक किक देता है कि हाँ, यह अभी भी एक स्क्रिप्टिंग भाषा है। और यह केवल इसलिए है क्योंकि भाषा पटकथा पहलू को छिपाने में अच्छा है (यह मानते हुए कि आप इसे सही तरीके से उपयोग करते हैं)।
ज़ोरान पावलोविक

@ZoranPavlovic जिज्ञासा से बाहर है, यह एक पटकथा भाषा होने का परिणाम क्यों है? जब डेटा बाउंड होता है, तो यह एक समस्या लगती है और क्योंकि सूचियाँ परस्पर होती हैं (जो कि दो चीजें हैं जो सामान्य रूप से अच्छी होती हैं, लेकिन एक साथ संयुक्त होने पर खराब होती हैं)। एक ही समस्या एक गैर-स्क्रिप्टिंग भाषा में हो सकती है यदि आप फ़ंक्शन को कॉल किए जाने के बाद हर बार एक नई सूची बनाने के बजाय फ़ंक्शन निर्माण के समय डेटा को बाध्य करते हैं।
जेस्टर्नबर्ग

@ ऐब: मुझे ऐसा नहीं लगता - यहाँ का पैरामीटर, हर दूसरे पायथन ऑब्जेक्ट की तरह - किसी ऑब्जेक्ट का पॉइंटर है। इस स्थिति में, ऑब्जेक्ट एक परिवर्तनशील है, और फ़ंक्शन घोषित होने पर चर बाध्य है। पैरामीटर "कॉल के दौरान जीवित रहता है", लेकिन जो बचता है वह एक परिवर्तनशील वस्तु का संदर्भ है।
पैट्रिक कॉलिन्स

14

पायथन की कुछ विशेषताएं जो इसे एक विकास भाषा के रूप में इतना लचीला बनाती हैं, जिन्हें C ++ और जावा जैसी भाषाओं में संकलन और लिंकिंग प्रक्रिया द्वारा किए गए "पूरे कार्यक्रम" स्थैतिक विश्लेषण के लिए उपयोग की जाने वाली बड़ी कमियों के रूप में भी देखा जाता है।

  • स्थानीय चरों की अवैध घोषणा

स्थानीय चर को साधारण असाइनमेंट स्टेटमेंट का उपयोग करके घोषित किया जाता है। इसका मतलब यह है कि किसी भी अन्य दायरे में परिवर्तनशील बाइंडिंग को संकलक द्वारा उठाए जाने वाले स्पष्ट एनोटेशन की आवश्यकता होती है (बाहरी स्कोप के लिए वैश्विक और गैर-फोकल घोषणाएं, उदाहरण के स्कोप के लिए विशेषता पहुंच संकेतन)। यह बड़े पैमाने पर प्रोग्रामिंग करते समय आवश्यक बॉयलरप्लेट की मात्रा को कम कर देता है, लेकिन इसका मतलब है कि तीसरे पक्ष के स्थिर विश्लेषण उपकरण (जैसे कि पाइफ्लेक्स) को उन चेकों को निष्पादित करने की आवश्यकता होती है जो संकलक द्वारा स्पष्ट चर घोषणाओं की आवश्यकता होती है।

  • "मंकी पैचिंग" समर्थित है

मॉड्यूल, क्लास ऑब्जेक्ट और यहां तक ​​कि बिल्टिन नेमस्पेस की सामग्री को रनटाइम पर संशोधित किया जा सकता है। यह बेहद शक्तिशाली है, जिससे कई अत्यंत उपयोगी तकनीकों की अनुमति मिलती है। हालाँकि, इस लचीलेपन का अर्थ है कि पायथन कुछ विशेषताओं को सामान्य रूप से टाइप की गई ओओ भाषाओं के लिए नहीं देता है। विशेष रूप से, उदाहरण के लिए "सेल्फ" पैरामीटर विधियों का अर्थ अंतर्निहित होने के बजाय स्पष्ट है (क्योंकि "विधियों" को एक वर्ग के अंदर परिभाषित नहीं करना पड़ता है, उन्हें बाद में कक्षा को संशोधित करके जोड़ा जा सकता है, जिसका अर्थ है कि यह विशेष रूप से व्यावहारिक नहीं है उदाहरण संदर्भ को स्पष्ट रूप से पारित करने के लिए) और विशेषता अभिगम नियंत्रणों को आसानी से इस आधार पर लागू नहीं किया जा सकता है कि क्या वर्ग "अंदर" या "बाहर" है या नहीं (क्योंकि वह परिभाषा केवल मौजूद है जबकि वर्ग परिभाषा निष्पादित की जा रही है)।

  • धातु से दूर

यह कई अन्य उच्च स्तरीय भाषाओं के बारे में भी सच है, लेकिन पायथन सबसे हार्डवेयर विवरणों को छोड़ देता है। सी और सी ++ जैसी सिस्टम प्रोग्रामिंग भाषाएं अभी भी प्रत्यक्ष हार्डवेयर एक्सेस को संभालने के लिए अभी भी बेहतर अनुकूल हैं (हालांकि, पायथन काफी खुश होकर या तो सीपीथॉन एक्सटेंशन मॉड्यूल के माध्यम से या ctypesलाइब्रेरी के माध्यम से, अधिक पोर्ट्रेट से बात करेंगे )।


12
  1. {} / शुरू-अंत के बजाय कोड ब्लॉक के लिए इंडेंटेशन का उपयोग करना, जो भी हो।
  2. हर नई आधुनिक भाषा में उचित शाब्दिक स्कूपिंग है, लेकिन पायथन नहीं (नीचे देखें)।
  3. अराजक डॉक्स (Perl5 प्रलेखन के साथ तुलना करें, जो शानदार है)।
  4. स्ट्रेट-जैकेट (ऐसा करने का केवल एक ही तरीका है)।

टूटी हुई स्कूपिंग के लिए उदाहरण; दुभाषिया सत्र से प्रतिलेख:

>>> 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

globalऔर nonlocalइस डिज़ाइन की मूर्खता को पैच करने के लिए कीवर्ड पेश किए गए हैं।


2
स्कोपिंग के बारे में, वर्तमान विधि के तर्क को समझने के लिए उत्सुक को python.org/dev/peps/pep-3104 पर देखने के लिए इसके लायक हो सकता है ।
विंस्टन एवर्ट

+1 से सहमत हैं। तो, +1।
१२:१२ पर जस

34
ऐसा करने का एक तरीका है एक फायदा है। जब आप किसी और के कोड को पढ़ते हैं तो आपके पास कभी भी एकल विवरण नहीं होता है। एक बार जब मुहावरों को आपके मस्तिष्क में कठोर किया जाता है, तो आपको तुरंत पहचान होनी चाहिए।
rox0r

9
पूरी तरह से @ rox0r से सहमत हैं। "स्ट्रेट-जैकेट" सभी प्रकार के वाक्यविन्यास युद्धों को रोकता है।
कीथजग्रंट

8
ईमानदार होने के लिए, मुझे बहुत कम globalया nonlocalपायथन में कीवर्ड की आवश्यकता है । इसलिए शायद ही कभी मैं भूलता हूं कि यह मुद्दा मौजूद है और इसे फिर से गूगल करना है, यह कुछ समय पहले आया है, इस तथ्य के बावजूद कि मैं हर दिन काम पर पायथन कोड लिखता हूं। मेरे लिए, कोड जिसे वैश्विक चर (या बदतर, बाहरी गैर-वैश्विक चर) को संशोधित करने की आवश्यकता है, एक कोड गंध है। आमतौर पर (हमेशा नहीं) एक बेहतर तरीका है।
बेन

11

मुझे ऑब्जेक्ट-ओरिएंटेड this.method()और प्रक्रियात्मक / कार्यात्मक method(this)वाक्यविन्यास के अजगर का संयोजन बहुत ही अनिश्चित लगता है:

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

यह विशेष रूप से बुरा है क्योंकि बड़ी संख्या में फ़ंक्शन (विधियों के बजाय) को केवल वैश्विक नामस्थान में डंप किया जाता है : सूचियों, तार, संख्या, निर्माता, मेटाप्रोग्रामिंग से संबंधित विधियाँ, सभी एक बड़ी वर्णानुक्रम सूची में मिश्रित होती हैं।

बहुत कम से कम, कार्यात्मक भाषाओं जैसे एफ # में सभी फ़ंक्शन ठीक से मॉड्यूल में नामांकित हैं:

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

तो वे सब एक साथ नहीं हैं। इसके अलावा, यह पुस्तकालय भर में पालन किया जाने वाला एक मानक है, इसलिए कम से कम यह सुसंगत है।

मैं फंक्शन बनाम मेथड चीज़ को करने के कारणों को समझता हूं , लेकिन मुझे अभी भी लगता है कि उन्हें इस तरह मिलाना एक बुरा विचार है। यदि विधि-वाक्य-विन्यास का अनुसरण किया जाता, तो मैं कम से कम आम कार्यों के लिए बहुत खुश होता:

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

क्या विधियाँ उत्परिवर्तित हो रही हैं या नहीं, उन्हें वस्तु पर विधियों के रूप में होने के कई फायदे हैं:

  • डेटा-प्रकार पर "सामान्य" संचालन देखने के लिए एकल स्थान: अन्य पुस्तकालय / आदि। अन्य फैंसी चीजें हो सकती हैं जो वे डेटाटाइप्स के लिए कर सकते हैं लेकिन "डिफ़ॉल्ट" ऑपरेशन सभी ऑब्जेक्ट के तरीकों में हैं।
  • Moduleकॉल करते समय दोहराते रहने की आवश्यकता नहीं है Module.method(x)। ऊपर कार्यात्मक सूची उदाहरण लेते हुए, मुझे बार-बार क्यों कहना पड़ता है List? यह पता होना चाहिए कि यह एक है Listऔर मैं इस Navigation.map()पर फ़ंक्शन को कॉल नहीं करना चाहता हूं ! x.map()वाक्यविन्यास का उपयोग यह DRY रखता है और अभी भी असंदिग्ध है।

और निश्चित रूप से इसके पुट- ऑफ -इन-ग्लोबल-नेमस्पेस के फायदे हैं । ऐसा नहीं है कि वर्तमान तरीका चीजों को प्राप्त करने में असमर्थ है। यह बहुत सुंदर है ( len(lst)), क्योंकि कुछ भी नामांकित नहीं है! मैं फ़ंक्शंस (डिफ़ॉल्ट व्यवहार, आदि) का उपयोग करने के तरीकों पर फायदे समझ रहा हूं, लेकिन मुझे अभी भी यह पसंद नहीं है।

यह सिर्फ गड़बड़ है। और बड़ी परियोजनाओं में, गंदगी आपका सबसे बड़ा दुश्मन है।


1
हाँ ... मैं वास्तव में LINQ शैली को याद करता हूं (मुझे यकीन है कि LINQ इसे लागू करने वाला पहला नहीं है, लेकिन मैं इससे सबसे ज्यादा परिचित हूं) सूची संभालना।
CookieOfFortune

1
विधि के रूप में लेन (x) के बारे में न सोचें। "लेन" एक फ़ंक्शन है। पायथन के कार्य और विधियां हैं और मुझे उस दृष्टिकोण में कुछ भी गलत नहीं दिखता है। उचित कार्यों का अभाव, आमतौर पर, बहुत सारे अनावश्यक टाइपिंग का स्रोत है।
राबनी

मुझे पता len()है कि एक समारोह है, और क्या फायदे हैं। मैंने यह भी कहा कि मुझे क्यों लगता है कि यह एक बुरा विचार है, क्यों मुझे लगता है कि वैश्विक कार्य एक विशेष रूप से बुरा विचार है, और क्यों मुझे लगता है कि विधियां आपकी कार्यक्षमता को व्यवस्थित करने और स्कूप करने का एक सुविधाजनक तरीका प्रदान करती हैं =)
Haoyi

मुझे नहीं लगता कि 42 (या यह 43 है?) कीवर्ड एक 'बड़ी' संख्या है। इसमें ऐसी चीजें भी शामिल हैं def, classऔर अन्य गैर-फ़ंक्शन कॉल। सबसे लोकप्रिय भाषाओं में 100+ के साथ तुलना करें। इसके अलावा, से लाइन पर विचार import this: Namespaces are one honking great idea -- let's do more of those!। मुझे लगता है कि आप पायथन नामस्थान को गलत समझ सकते हैं;)
वेन वर्नर

8

समरूपता का अभाव ।

पायथन को "कीवर्ड" के साथ जोड़ने के लिए 3.x का इंतजार करना पड़ा। किसी भी समलैंगिक भाषा में इसे तुच्छ रूप से एक पुस्तकालय में जोड़ा जा सकता था।

अधिकांश अन्य मुद्दे जो मैंने उत्तर में देखे हैं, वे 3 प्रकारों में से एक हैं:

1) वे चीजें जो टूलींग के साथ तय की जा सकती हैं (उदाहरण pyflakes) 2) कार्यान्वयन विवरण (GIL, प्रदर्शन) 3) वे चीजें जो कोडिंग मानकों के साथ तय की जा सकती हैं (यानी लोगों की इच्छाएं नहीं थीं)

# 2 भाषा के साथ कोई समस्या नहीं है, IMO # 1 और # 3 गंभीर समस्याएं नहीं हैं।


1
withपायथन 2.5 के साथ उपलब्ध था from __future__ import with_statement, लेकिन मैं मानता हूं, मैंने कभी-कभी इसे दुर्भाग्यपूर्ण पाया है कि नियमित कार्यों के बजाय if/ for/ print/ आदि जैसे बयान "विशेष" हैं
22

7

पाइथन मेरी पसंदीदा भाषा है क्योंकि यह बहुत अभिव्यंजक है, लेकिन फिर भी आपको बहुत सारी गलतियाँ करने से रोकता है। मेरे पास अभी भी कुछ चीजें हैं जो मुझे परेशान करती हैं:

  • कोई वास्तविक अनाम फ़ंक्शन नहीं। लैम्ब्डा का उपयोग एकल-स्टेटमेंट फ़ंक्शन के लिए किया जा सकता है, और withस्टेटमेंट का उपयोग कई चीजों के लिए किया जा सकता है जहां आप रूबी में एक कोड ब्लॉक का उपयोग करेंगे। लेकिन कुछ स्थितियों में यह चीजों को थोड़ा और अधिक भद्दा बना देता है जितना कि उन्हें होना चाहिए। (अनाड़ी के रूप में दूर के रूप में यह जावा में होगा, लेकिन अभी भी ...)

  • मॉड्यूल और फ़ाइलों के बीच के संबंध में कुछ भ्रम। कमांड लाइन से "python foo.py" चलाना "इम्पोर्ट फ़ू" से अलग है। पाइथन 2.x में सापेक्ष आयात भी समस्या पैदा कर सकता है। फिर भी, पायथन के मॉड्यूल C, C ++ और रूबी की संगत विशेषताओं से बहुत बेहतर हैं।

  • स्पष्ट करना self। भले ही मैं इसके कुछ कारणों को समझता हूं, और भले ही मैं रोजाना पाइथन का उपयोग करता हूं, लेकिन मैं इसे भूलने की गलती करता हूं। इसके साथ एक और मुद्दा यह है कि एक मॉड्यूल से एक वर्ग बनाने के लिए यह थोड़ा थकाऊ हो जाता है। स्पष्ट स्व सीमित मरोड़ से संबंधित है जो दूसरों ने शिकायत की है। पायथन में सबसे छोटा स्कोप फंक्शन स्कोप है। यदि आप अपने कार्यों को छोटा रखते हैं, जैसा कि आपको करना चाहिए, तो यह अपने आप में कोई समस्या नहीं है और आईएमओ अक्सर क्लीनर कोड देता है।

  • कुछ वैश्विक कार्य, जैसे कि len, आप एक विधि होने की उम्मीद करेंगे (जो वास्तव में पर्दे के पीछे है)।

  • महत्वपूर्ण इंडेंटेशन। विचार ही नहीं है, जो मुझे लगता है कि महान है, लेकिन चूंकि यह एकमात्र ऐसी चीज है जो इतने सारे लोगों को पायथन की कोशिश करने से रोकती है, शायद अजगर कुछ (वैकल्पिक) शुरू / अंत प्रतीकों के साथ बेहतर होगा। उन लोगों को नजरअंदाज करते हुए, मैं पूरी तरह से इंडेंटेशन के लिए एक लागू आकार के साथ रह सकता था।

  • यह जावास्क्रिप्ट के बजाय वेब ब्राउज़र की अंतर्निहित भाषा नहीं है।

इन शिकायतों में से, यह केवल पहली बार है कि मैं इस बारे में पर्याप्त देखभाल करता हूं कि मुझे लगता है कि इसे भाषा में जोड़ा जाना चाहिए। पिछले वाले को छोड़कर बाकी लोग मामूली हैं, अगर ऐसा हुआ तो बहुत अच्छा होगा!


+1 यह मुझे आश्चर्यचकित करता है कि क्या लिखना है datetime.datetime.now()जब एक परियोजना लिख ​​सकता है datetime.nowऔर फिर दो परियोजनाओं को मिलाने का एक तरीका यह लिख सकता है कि यह दूसरे पर लागू होता है और निश्चित रूप से यह जावा में नहीं हुआ होगा जो एक फ़ाइल के रूप में एक मॉड्यूल का नाम नहीं देगा (?) यदि आप देखते हैं कि कैसे सामान्य तरीके से लगता है कि मॉड्यूल फ़ाइल के साथ हमें भ्रमित कर रहा है जब दोनों का उपयोग किया जाता है और स्पष्ट है कि selfमैं अभी भी समझने की कोशिश करता हूं क्योंकि कॉल में फ़ंक्शन के समान तर्क नहीं हैं। और आप सोच सकते हैं कि वीएम अजगर धीमा है?
निकोलस रोसेंक्रांटज़

स्पष्ट स्व कीवर्ड के साथ आपकी समस्या के बारे में। क्या मैं इसके लिए एक अच्छा अजगर आईडीई का उपयोग करने का सुझाव दे सकता हूं? मुझे पता है कि ग्रहण ऑटो पर PyDev एक फ़ंक्शन हस्ताक्षर के स्वयं भाग को पूरा करता है यदि यह पता लगाता है कि आप एक कक्षा के अंदर लिख रहे हैं।
ज़ोरान पावलोविच

5

पायथन पूरी तरह से परिपक्व नहीं है: समय पर इस समय अजगर 3.2 भाषा में वर्तमान में वितरित किए गए अधिकांश पैकेजों के साथ संगतता की समस्या है (आमतौर पर वे अजगर 2.5 के साथ संगत हैं)। यह एक बड़ी खामी है जिसे वर्तमान में अधिक विकास के प्रयास की आवश्यकता है (पैकेज की आवश्यकता को ढूंढें; संगतता को सत्यापित करें; एक गैर-अच्छे पैकेज को चुनें; जो अधिक संगत हो सकता है; सबसे अच्छा संस्करण ले; इसे 3.2 पर अपडेट करें, जिसमें कुछ दिन लग सकते हैं; तब; कुछ उपयोगी करना शुरू करें)।

2012 के मध्य में संभवतः यह कमबैक होगा।

ध्यान दें कि मुझे लगता है कि मैं एक प्रशंसक-लड़के द्वारा अपमानित हो गया हूं। एक डेवलपर चर्चा के दौरान हमारी उच्च स्तरीय डेवलपर टीम उसी निष्कर्ष पर पहुंची, हालांकि।

एक मुख्य अर्थ में परिपक्वता का मतलब है कि एक टीम प्रौद्योगिकी का उपयोग कर सकती है और छिपे हुए जोखिमों के साथ (संगतता समस्याओं सहित) बहुत जल्दी और ऊपर हो सकती है। आज के अधिकांश पैकेजों के लिए 3 पार्टी पायथन पैकेज और कई ऐप 3.2 से कम में काम नहीं करते हैं। यह एकीकरण, परीक्षण, हाथ में समस्या को हल करने के बजाय प्रौद्योगिकी को फिर से लागू करना == कम परिपक्व तकनीक का अधिक काम करता है।

जून 2013 के लिए अपडेट: पायथन 3 में अभी भी परिपक्वता समस्याएं हैं। हर बार जब टीम का कोई सदस्य आवश्यक पैकेज का उल्लेख करेगा, तब कहेंगे "सिवाय इसके केवल 2.6 के लिए" (इनमें से कुछ मामलों में मैंने 2.6 के साथ 2.6-एकमात्र पैकेज का उपयोग करने के लिए लोकलहोस्ट सॉकेट के माध्यम से वर्कअराउंड लागू किया है, और बाकी सभी हमारे उपकरण 3.2 के साथ रहते हैं)। मोइनमोइन भी नहीं, शुद्ध-अजगर विकी, पायथन 3 में लिखा गया है।


2
मैं आपसे केवल तभी सहमत हूं जब आपकी परिपक्वता की परिभाषा एक ऐसे संस्करण के साथ संगत नहीं है जो डिजाइन द्वारा असंगत है
tshepang

3
मैं मानता हूँ कि अजगर की दो असंगत धाराएँ एक समस्या है (हालाँकि समझने योग्य है कि ऐसा क्यों किया गया था), लेकिन मैं इसे "परिपक्वता" के मुद्दे के रूप में नहीं देखता।
विंस्टन इर्वर्ट

एक अर्थ में परिपक्वता का मतलब है कि एक टीम प्रौद्योगिकी का उपयोग कर सकती है और छिपे हुए जोखिमों के साथ (संगतता समस्याओं सहित) बहुत जल्दी और ऊपर हो सकती है। आज के अधिकांश पैकेजों के लिए 3 पार्टी पायथन पैकेज और कई ऐप 3.2 से कम में काम नहीं करते हैं। यह एकीकरण, परीक्षण, हाथ में समस्या को हल करने के बजाय प्रौद्योगिकी को फिर से लागू करना == कम परिपक्व तकनीक का अधिक काम करता है।
जोनाथन क्लाइन IEEE

2
तो बस पायथन 2.x का उपयोग करें। तुम्हें पता है ... संस्करण हर कोई उपयोग कर रहा है। या यह पता लगाने के लिए कि यह किस संस्करण के अनुकूल है, यह जानने के लिए 2 सेकंड के लिए पैकेज प्रलेखन पढ़ें।
जेस्टर्नबर्ग २५'११

2
"सिर्फ इसलिए कि अजगर 3.0 को कुछ समय के लिए जारी किया गया है, इसका मतलब यह नहीं है कि आपको जिस संस्करण का उपयोग करना चाहिए वह है। अजगर 3.0 और 2.x को एक ही समय में विकसित किया जा रहा है। मुझे आशा है कि भविष्य में हम सभी का उपयोग करने में सक्षम होंगे। अजगर 3.0, लेकिन अब के लिए 2.x का उपयोग करना एक अच्छा समाधान है "-> यह कहने का एक 500 वर्ण तरीका है: यह अभी तक परिपक्व नहीं है।
जोनाथन क्लाइन IEEE

4

पाइथन की स्कूपिंग बुरी तरह से टूट गई है, जो पाइथन में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को बहुत अजीब बनाता है।


8
क्या आप एक उदाहरण दे सकते हैं? (मुझे यकीन है कि आप सही हैं, लेकिन मैं एक उदाहरण चाहूंगा)
विंस्टन एवर्ट

24
मुझे पाइथन पसंद है लेकिन मैं एक उदाहरण संपत्ति और विधि के लिए हर संदर्भ के सामने रखने के लिए पूरी तरह से घृणा करता हूं self.। रूबी में ऐसा करना इतना आसान है जैसे कि एक DSL बनाने के लिए Python का उपयोग करना असंभव हो जाता है।
एडम क्रॉसलैंड

35
मुझे स्वयं अजीब नहीं लगता, मुझे खोजकर्ता पसंद है।
विंस्टन इर्वर्ट

9
मैं यह नहीं देखता कि स्पष्ट स्व के बारे में क्या बड़ी बात है। C ++, Java और D में, लोग अक्सर किसी भी तरह से कन्वेंशन द्वारा सदस्य चर स्पष्ट करते हैं, उदाहरण के लिए उन्हें अंडरस्कोर के साथ उपसर्ग करके।
dsimcha

7
आप अपने घोषणा से अलग तरीकों में स्वयं का उपयोग करते हैं: फू फू (स्व) लेकिन स्व.फू ()। मैं स्पष्ट परिभाषा के इस मिश्रण को ढूँढता हूं, लेकिन पीछे के दृश्य सामान बहुत सुंदर नहीं हैं।
लेनीप्रोग्रामर्स

4

अजगर के बारे में मेरी पकड़:

  • बोल्ट पर OOP (इस पर विस्तार के लिए @ mipadi का जवाब देखें)
  • लंबोदर का टूटा हुआ कार्यान्वयन
  • स्कोप मुद्दों
  • मानक पुस्तकालय में कोई लगातार संग्रह नहीं
  • एम्बेडेड DSLs के लिए गरीब amenability

क्यों होता है पतन?
लापताफैक्टर

मैं नीच नहीं हूं, लेकिन क्या आप बता सकते हैं कि आपको क्यों लगता है कि ओओ पर बोल्ट लगाया गया है? पायथन में हमेशा OO होता है, यह भाषा का एक मुख्य हिस्सा है।
डेनिथ

देखिए @ मिपाडी का जवाब
लापताफैक्टर


4

पायथन में एक्सेस संशोधक लागू नहीं होते हैं - अच्छी तरह से संरचित, मॉड्यूलर कोड लिखना मुश्किल बनाता है।

मुझे लगता है कि @ मेसन की टूटी हुई स्कूपिंग का एक हिस्सा है - सामान्य रूप से इस भाषा के साथ एक बड़ी समस्या। ऐसे कोड के लिए जो पठनीय माना जाता है, यह समझ पाना काफी मुश्किल है कि क्या हो सकता है और इसका दायरा क्या होना चाहिए और किसी भी समय में इसका मूल्य क्या होगा - मैं वर्तमान में इन कमियों के कारण पायथन भाषा से आगे बढ़ने के बारे में सोच रहा हूं। ।

सिर्फ इसलिए कि "हम सभी सहमति देने वाले वयस्क हैं" का मतलब यह नहीं है कि हम गलतियाँ नहीं करते हैं और एक मजबूत संरचना के भीतर बेहतर काम नहीं करते हैं, खासकर जब जटिल परियोजनाओं पर काम कर रहे हैं - इंडेंटेशन और अर्थहीन अंडरस्कोर पर्याप्त नहीं लगते हैं ।


इसलिए एक्सेस कंट्रोल की कमी खराब है ... लेकिन किसी भी गैर-स्थानीय नेमस्पेस को वेरिएबल का स्पष्ट रूप से लिखना भी बुरा है?
ncoghlan

@ncoghlan: 1 - यह सुविधा कई आधुनिक भाषाओं में मानक है, इस पर निर्भर करता है कि आप अपनी परियोजना को कैसे कॉन्फ़िगर करते हैं। 2-यह प्रोग्रामर के नियंत्रण में है। 3 - यकीन नहीं है कि इसके बारे में क्या महान है - आप आसानी से अधिकांश संकलित भाषाओं / आईडीई में कुछ प्रोजेक्ट सेटिंग्स के साथ अपने दायरे को नियंत्रित कर सकते हैं। अगर 'हम सभी वयस्क सहमति दे रहे हैं', तो हमें अपने निर्णय लेने में सक्षम होना चाहिए और अपने विशेष आराम स्तर के अनुसार गुंजाइश को समायोजित करना चाहिए।
वेक्टर

2
बात यह है कि "लागू अभिगम नियंत्रण" के लिए पूछ रहे लोग हमें उन चीजों में से एक को निकालने के लिए कह रहे हैं जो पायथन को इतनी शानदार गोंद भाषा बनाती है: डेवलपर्स के लिए यह जानबूझकर कठिन है कि उनके कोड का उपयोग कैसे किया जाए। C ++ और जावा पैटर्न में बॉयलरप्लेट का कितना हिस्सा केवल लागू अभिगम नियंत्रण के आसपास काम करने के लिए है? मैं निश्चित रूप से उन कारणों के लिए पायथन का उपयोग नहीं करने वाले लोगों को समझ सकता हूं, लेकिन स्थैतिक प्रवर्तन कभी भी कठोर परीक्षण का विकल्प नहीं बनने वाला है।
ncoghlan

1
@ncoghlan - मेरे लिए पायथन के बारे में महान बातें वाक्यविन्यास और संक्षिप्तता की लालित्य हैं - अभिव्यक्ति। और जैसा कि मैंने कहा, कोडिंग प्रोग्रामर के साथ ऐसा करने के लिए स्कूपिंग कम है, जो उन्हें कोड संरचना और संगठन के साथ नहीं करना चाहिए - इसलिए 'वयस्कों की सहमति' की अवधारणा मूट है। मैं जटिल परियोजनाओं पर काम करता हूं, सरल उपयोगिताओं और लिपियों पर नहीं - कोड को ध्यान से संशोधित और संरचित होना चाहिए - पहुंच संशोधक यह सुनिश्चित करने के सबसे महत्वपूर्ण तरीकों में से एक है।
वेक्टर

1
और कोड की समीक्षा, प्रशिक्षण और युग्मन विश्लेषण अन्य हैं। मेरे लिए, लागू पहुंच नियंत्रण स्थिर टाइपिंग के रूप में एक ही बाल्टी में आते हैं: वे शुद्धता में कुछ अतिरिक्त आत्मविश्वास प्रदान करने में मदद करते हैं (लेकिन व्यापक परीक्षण की आवश्यकता से बचने के लिए पर्याप्त नहीं), लेकिन विकास उत्पादकता में उच्च लागत पर। (एक व्यावहारिक स्तर पर, क्लास विशेषता अभिगम नियंत्रण भी पायथन के ऑब्जेक्ट मॉडल के साथ फिट नहीं होते हैं, जहां कक्षाएं कक्षाओं से प्राप्त होने वाले साधारण कार्य हैं। कक्षाओं के लिए "अंदर / बाहर" सीमा वास्तव में मौजूद नहीं है, इसलिए यह नहीं हो सकता है। लागू)
ncoghlan

3
  1. प्रदर्शन अच्छा नहीं है, लेकिन pypy के साथ सुधार कर रहा है,
  2. GIL कोड को गति देने के लिए थ्रेडिंग के उपयोग को रोकता है, (हालाँकि यह आमतौर पर समय से पहले का अनुकूलन है),
  3. यह केवल अनुप्रयोग प्रोग्रामिंग के लिए उपयोगी है,

लेकिन इसमें कुछ बेहतरीन रिडीमिंग विशेषताएं हैं:

  1. यह RAD के लिए एकदम सही है,
  2. C के साथ इंटरफ़ेस करना आसान है (और C के लिए अजगर इंटरप्रेटर एम्बेड करना है),
  3. यह बहुत पठनीय है,
  4. यह सीखना आसान है,
  5. यह अच्छी तरह से प्रलेखित है,
  6. बैटरियों को वास्तव में शामिल किया गया है, यह मानक पुस्तकालय विशाल है और व्यावहारिक रूप से सब कुछ के लिए पीपीआई में मॉड्यूल शामिल हैं,
  7. इसका एक स्वस्थ समुदाय है।

फायदे बताने के लिए क्या प्रेरित किया? समस्याओं के लिए सवाल। वैसे भी, आप क्या मतलब है कि यह केवल अनुप्रयोग प्रोग्रामिंग के लिए उपयोगी है? अन्य प्रोग्रामिंग क्या है? क्या यह विशेष रूप से अच्छा नहीं है?
tshepang

5
मैंने फायदे सूचीबद्ध किए क्योंकि मुझे लगता है कि वे विपक्ष को पछाड़ते हैं। क्या आपने कभी अजगर में एक लिनक्स कर्नेल मॉड्यूल को लागू करने की कोशिश की है।
dan_waterworth

3

मैं अजगर पर एहसान करता हूं और मेरे दिमाग में आने वाला पहला नुकसान यह है कि जब if myTest():आप किसी स्टेटमेंट पर टिप्पणी करते हैं, तो आपको पूरे निष्पादित ब्लॉक के इंडेंटेशन को बदलना होगा जो आपको सी या जावा के साथ नहीं करना होगा। वास्तव में अजगर में इफ-क्लॉज पर टिप्पणी करने के बजाय मैंने इसे इस तरह से टिप्पणी करना शुरू कर दिया है: `इफ ट्रू: # मैंटेस्ट () इसलिए मुझे निम्नलिखित कोड ब्लॉक भी नहीं बदलना पड़ेगा। चूंकि जावा और सी इंडेंटेशन पर भरोसा नहीं करते हैं, इसलिए यह सी और जावा के साथ स्टेटमेंट को आसान बनाना है।


1
आप अपनी इंडेंटेशन को बदले बिना कुछ कोड के ब्लॉक स्तर को बदलने के लिए सी या जावा कोड को गंभीरता से संपादित करेंगे?
बेन

4
@ अस्थायी रूप से, हाँ ...
वैकल्पिक

1
@ यहां भी ऐसा ही हुआ।
क्रिस्टोफर महान

2
मैं बदलने की चाल का उपयोग if something()करने के लिए if False and something()। मल्टी-लाइन स्ट्रिंग का उपयोग करके एक और चाल "टिप्पणी" करना है।
मार्टिन विलकंस

1
@ कोर्स का कोर्स! अगर झूठ ...
क्रिस्टोफर महान

3

एकाधिक प्रेषण अच्छी तरह से स्थापित एकल-प्रेषण प्रकार प्रणाली के साथ एकीकृत नहीं करता है और बहुत अच्छा नहीं है।

डायनेमिक लोडिंग समानांतर फाइल सिस्टम पर एक बड़ी समस्या है, जहां POSIX- जैसे शब्दार्थ मेटाडेटा-सघन संचालन के लिए भयावह धीमी गति से चलते हैं। मेरे पास ऐसे सहकर्मी हैं जिन्होंने 65 मिलियन कोर पर लोड किए गए एक चौथाई मिलियन कोर-घंटों को केवल पायथन (संख्यात्मक, mpi4py, Petsc4py और अन्य एक्सटेंशन मॉड्यूल के साथ) प्राप्त किया है। (सिमुलेशन ने एक महत्वपूर्ण नए विज्ञान परिणाम प्रदान किए, इसलिए यह इसके लायक था, लेकिन यह एक समस्या है जब एक बैरल से अधिक तेल को एक बार पाइथन लोड करने के लिए जला दिया जाता है।) सांख्यिकीय रूप से लिंक करने में असमर्थता ने हमें महान अंतर्विरोधों पर जाने के लिए मजबूर किया है। बड़े पैमाने पर उचित लोड बार, जिसमें dlopenकलेक्टिव फाइल सिस्टम एक्सेस करने के लिए libc-rtld पैचिंग शामिल है ।


वाह, बहुत तकनीकी लगता है, क्या आपके पास इस विषय पर कोई संदर्भ सामग्री, उदाहरण, ब्लॉग पोस्ट या लेख हैं? मुझे आश्चर्य है कि अगर मैं निकट भविष्य में इस तरह के मामलों से अवगत कराया जा सकता है।
विन्सेन्ट

Aron ने SciPy 2012 में एक वार्ता दी । dlopenसामान हमारे में है collfs पुस्तकालय। उस भंडार में एशर लैंग्टन के पथ कैशिंग से प्रेरित अतिरिक्त जिपिमपोर्ट चालें भी हैं। हम बेहतर वितरण और एक पेपर पर काम कर रहे हैं।
जैद

3
  • बहुत मुख्यधारा 3 पार्टी पुस्तकालयों और सॉफ्टवेयर का एक गुच्छा जो व्यापक रूप से उपयोग किया जाता है, काफी पायथोनिक नहीं हैं। कुछ उदाहरण: सोपलिब, ओपनर, रिपोर्टलैब। समालोचना बाहर की गुंजाइश है, यह वहां है, इसका व्यापक रूप से उपयोग किया जाता है, लेकिन यह अजगर संस्कृति को भ्रमित करता है (यह उस आदर्श वाक्य को चोट पहुंचाता है जो कहता है कि "एक होना चाहिए - और अधिमानतः केवल एक - ऐसा करने के लिए स्पष्ट तरीका")। ज्ञात pythonic सफलताओं (जैसे django या trac) अपवाद प्रतीत होती हैं।
  • उदाहरण, वर्ग, अमूर्तता के अमूर्त की संभावित असीमित गहराई वैचारिक रूप से सुंदर और अद्वितीय है। लेकिन इसमें महारत हासिल करने के लिए आपको दुभाषिया (जिस क्रम में अजगर कोड की व्याख्या की जाती है, आदि) को गहराई से जानना होगा। यह व्यापक रूप से ज्ञात नहीं है और इसका उपयोग किया जाता है (या सही ढंग से उपयोग किया जाता है), जबकि इसी तरह का काला जादू जैसे कि सी # जेनरिक, जो कि वैचारिक रूप से अधिक जटिल (आईएमएचओ) लगता है और अधिक व्यापक रूप से ज्ञात और उपयोग किया जाता है, आनुपातिक रूप से।
  • मेमोरी और थ्रेडिंग मॉडल की एक अच्छी समझ पाने के लिए, आपको अजगर के साथ काफी अनुभवी होना चाहिए, क्योंकि कोई व्यापक कल्पना नहीं है। आप बस जानते हैं कि क्या काम करता है, हो सकता है कि आप दुभाषिया के स्रोतों या अनुभवी quirks को पढ़ते हैं और उन्हें ठीक करने का तरीका खोजते हैं। उदाहरण के लिए, केवल मजबूत या कमजोर संदर्भ हैं, न कि जावा के नरम और प्रेत रिफ। जावा में कचरा संग्रहण के लिए एक धागा है, जबकि अजगर में कचरा संग्रह कब होता है, इसके बारे में कोई औपचारिक जवाब नहीं है; आप बस यह देख सकते हैं कि यदि कोई अजगर कोड निष्पादित नहीं किया गया है, तो कचरा संग्रह नहीं होता है, और यह निष्कर्ष निकालता है कि स्मृति को आवंटित करने की कोशिश करते समय यह कभी-कभी हो रहा है। मुश्किल हो सकता है जब आप नहीं जानते कि एक बंद संसाधन क्यों जारी नहीं किया गया था (उस बारे में मेरा अनुभव mod_python in freeswitch में था)।

किसी भी तरह, अजगर मेरी 4 साल की मुख्य भाषा है। फैनबॉयस, अभिजात्य या मोनोमैनियाक होना अजगर संस्कृति का हिस्सा नहीं है।


+1। मेमोरी और थ्रेडिंग मॉडल के लिए युक्ति सही है। लेकिन एफडब्ल्यूआईडब्ल्यू, जावा कचरा कलेक्टर एक थ्रेड पर (और जीसी के बारे में और सब कुछ) एक जावा भाषा या वीएम विनिर्देशों का एक पहलू नहीं है, बल्कि एक विशेष जेवीएम के कार्यान्वयन का मामला है। हालांकि, मुख्य सन / ओरेकल जेवीएम बड़े पैमाने पर wrt GC व्यवहार और विन्यासता को प्रलेखित करता है, इस हद तक कि JVM ट्यूनिंग पर संपूर्ण पुस्तकें प्रकाशित हैं। सिद्धांत रूप में, कोई भी CPython को उसी तरह से प्रलेखित कर सकता है, भले ही भाषा की कल्पना हो।
एंड्रयू जानकी

2
  • अजीब OOP:
    • len(s) के माध्यम से __len__(self) और अन्य "विशेष तरीके"
    • अतिरिक्त विशेष विधियां जो अन्य विशेष विधियों ( __add__और के __iadd__लिए +और +=) से प्राप्त की जा सकती हैं
    • self पहले तरीके के पैरामीटर के रूप में
    • आप बेस क्लास कंस्ट्रक्टर को कॉल करना भूल सकते हैं
    • कोई पहुंच संशोधक (निजी, संरक्षित ...)
  • कोई निरंतर परिभाषा नहीं
  • कस्टम प्रकारों के लिए कोई अपरिवर्तनीयता नहीं
  • जीआईएल
  • खराब प्रदर्शन जो कि पायथन और सी का मिश्रण होता है और बिल्ड के साथ परेशानियों (सी कामों, प्लेटफ़ॉर्म निर्भरताओं की तलाश) ...
  • ख़राब प्रलेखन, विशेष रूप से तीसरे पक्ष के लिबास में
  • अजगर 2.x और 3.x के बीच असंगतता
  • खराब कोड विश्लेषण टूल (जावा या C # जैसी सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं की तुलना में)

5
व्यक्तिगत रूप से मुझे लगता है कि 2.x और 3.x के बीच असंगतता पायथन के सबसे बड़े लाभों में से एक है। यकीन है, यह भी एक नुकसान है। लेकिन पीछे की अनुकूलता को तोड़ने के लिए डेवलपर्स के दुस्साहस का मतलब यह भी है कि उन्हें cruft को अंतहीन रूप से ले जाने की आवश्यकता नहीं थी। अधिक भाषाओं को इस तरह के बदलाव की जरूरत है।
कोनराड रुडोल्फ

0

"अपरिवर्तनीयता" वास्तव में यह मजबूत बिंदु नहीं है। AFAIK नंबर, ट्यूपल्स और स्ट्रिंग्स अपरिवर्तनीय हैं, बाकी सब (यानी ऑब्जेक्ट्स) परस्पर भिन्न हैं। इसकी तुलना कार्यात्मक भाषाओं जैसे एरलांग या हास्केल से करें जहां सब कुछ अपरिवर्तनीय है (डिफ़ॉल्ट रूप से, कम से कम)।

हालाँकि, इम्युटीएबिलिटी वास्तव में संगति * के साथ चमकती है, जो कि पायथन का मजबूत बिंदु भी नहीं है, इसलिए कम से कम इसका परिणाम है।

(* = नाइटपिकर्स के लिए: मेरा मतलब है कि संगामिति जो कम से कम आंशिक रूप से समानांतर है। मुझे लगता है कि पायथन "सिंगल-थ्रेडेड" संगामिति के साथ ठीक है, जिसमें अपरिचय उतना महत्वपूर्ण नहीं है। हां, एफपी-प्रेमी, मुझे पता है कि अपरिवर्तनशीलता है। समसामयिक के बिना भी महान।))


0

मैं स्पष्ट रूप से समानांतर निर्माण करना पसंद करूंगा। अधिक बार नहीं, जब मैं एक सूची समझ लिखता हूं

[ f(x) for x in lots_of_sx ]

मुझे उस आदेश की परवाह नहीं है जिसमें तत्वों को संसाधित किया जाएगा। कभी-कभी, मुझे इस बात की भी परवाह नहीं है कि उन्हें किस क्रम में लौटाया जाता है।

यहां तक ​​कि अगर मेरे च के शुद्ध पायथन होने पर भी सीपीथॉन इसे अच्छी तरह से नहीं कर सकता है, तो इस तरह के व्यवहार को अन्य कार्यान्वयन के लिए परिभाषित किया जा सकता है।


// थ्रेड्स का स्पॉन गुच्छा // सभी क्यू क्यू को पास करें। customend ([x में लॉट के लिए x_s_sx]) que.wait () # थ्रेड द्वारा संसाधित होने के लिए सभी lot_of_sx की प्रतीक्षा करें।
ज़ोरान पावलोविक

0

अजगर के पास कोई टेल-कॉल अनुकूलन नहीं है, ज्यादातर दार्शनिक कारणों से । इसका मतलब यह है कि बड़ी संरचनाओं पर टेल-रिकैशिंग में ओ (एन) मेमोरी (अनावश्यक स्टैक के कारण जो रखी जाती है) हो सकती है और आपको ओ (1) मेमोरी प्राप्त करने के लिए एक लूप के रूप में रिकर्सन को फिर से लिखना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.