2010-04-25 20 views
7

क्या मुझे यहां कुछ याद आ रही है? "टूटा हुआ" अनुभाग के तहत कोड क्यों काम नहीं करना चाहिए? मैं पायथन 2.6 का उपयोग कर रहा हूँ।पायथन में अजीब सिंटेक्स पार्सिंग त्रुटि?

#!/usr/bin/env python 

def func(a,b,c): 
    print a,b,c 

#Working: Example #1: 

p={'c':3} 

func(1, 
    b=2, 
    c=3, 
    ) 

#Working: Example #2: 

func(1, 
    b=2, 
    **p) 

#Broken: Example #3: 

func(1, 
    b=2, 
    **p, 
    ) 
+2

जब मैं पायथन 2.6 के तहत इस कोड को आजमाता हूं, तो मुझे लाइन 1 (दूसरी कार्य) पर एक वाक्यविन्यास त्रुटि मिलती है। –

+0

धन्यवाद, मामूली टाइपो को उदाहरण # 2 में सही किया गया। – user213060

+1

और (महत्वहीन नहीं): आप इस असाधारण कॉमा क्यों चाहते हैं (इस व्यवहार की खोज के अलावा)? – ChristopheD

उत्तर

9

यह grammar से प्रासंगिक सा है:

arglist: (argument ',')* (argument [','] 
         |'*' test (',' argument)* [',' '**' test] 
         |'**' test) 

पहली पंक्ति यहाँ जब varargs/kwargs (यह क्यों अपना पहला उदाहरण काम करता है) का उपयोग नहीं कर पिछले पैरामीटर के बाद एक अल्पविराम डाल की अनुमति देता है । हालांकि, अगर इसे निर्दिष्ट किया गया है, तो आपको kwargs पैरामीटर के बाद कॉमा डालने की अनुमति नहीं है, जैसा कि दूसरी और तीसरी पंक्तियों में दिखाया गया है।

वैसे, यहाँ एक दिलचस्प बात व्याकरण द्वारा दिखाया गया है:

इन दोनों कानूनी हैं:

f(a=1, b=2, c=3,) 
f(*v, a=1, b=2, c=3) 

लेकिन यह नहीं है:

f(*v, a=1, b=2, c=3,) 

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

5

पायथन आमतौर पर अल्पविराम सूचियों (तर्क सूचियों और कंटेनर अक्षरों में) के अंत में अतिरिक्त कॉमा की अनुमति देता है। इसके लिए मुख्य लक्ष्य कोड पीढ़ी को थोड़ा आसान बनाना है (आपको अंतिम आइटम या डबल-स्पेशल-केस सिंगलटन टुपल के मामले में विशेष मामले नहीं है)।

व्याकरण की परिभाषा में, **kwargs अलग से बाहर निकाला गया है और अतिरिक्त वैकल्पिक कॉमा के बिना। जहां तक ​​मैं कल्पना कर सकता हूं, यह कोड पीढ़ी जैसे व्यावहारिक कुछ भी मदद नहीं करेगा (** kwargs हमेशा आखिरी चीज होगी, इसलिए आपको विशेष मामले में कुछ भी नहीं है), इसलिए मुझे नहीं पता कि पाइथन क्यों समर्थन करेगा यह।

संबंधित मुद्दे