2010-10-06 12 views
12

पायथन में, मैंने यह लिखा:यह वाक्यविन्यास त्रुटि क्यों करता है?

bvar=mht.get_value() 
temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) 

मैं तर्क के रूप में फ़ंक्शन कॉल में bvar का विस्तार करने की कोशिश कर रहा हूं। लेकिन फिर यह वापस आता है,

File "./unobsoluttreemodel.py", line 65 
    temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) 
               ^
SyntaxError: invalid syntax 

बस क्या होता है? यह सही सही होना चाहिए?

उत्तर

21

आप (mnt, False, bvar[0], bvar[1], ...) की एक टपल के रूप में अंतिम तर्क पारित करने के लिए चाहते हैं तो आप इस्तेमाल कर सकते हैं

temp = self.treemodel.insert(iter, 0, (mht,False)+tuple(bvar)) 

विस्तारित कॉल वाक्य रचना *b केवल अजगर 3 पर calling functions, function arguments में इस्तेमाल किया जा सकता है, और tuple unpacking। एक्स।

>>> def f(a, b, *c): print(a, b, c) 
... 
>>> x, *y = range(6) 
>>> f(*y) 
1 2 (3, 4, 5) 

ट्यूपल शाब्दिक इन मामलों में से किसी एक में नहीं है, इसलिए यह वाक्यविन्यास त्रुटि का कारण बनता है।

>>> (1, *y) 
    File "<stdin>", line 1 
SyntaxError: can use starred expression only as assignment target 
+1

दाएं, '*' रिज़ॉल्यूशन ऑपरेटर को टुपल्स बनाने की अनुमति नहीं है। – AndiDog

0

आपके पास वहां एक अतिरिक्त स्तर के कोष्ठक दिखाई देते हैं। प्रयास करें:

temp=self.treemodel.insert(iter,0,mht,False,*bvar) 

आपका अतिरिक्त कोष्ठक एक टपल * वाक्य रचना है, जो एक सिंटैक्स त्रुटि है का उपयोग कर बनाने के लिए कोशिश कर रहे हैं।

2

नहीं यह सही नहीं है। पैरामीटर विस्तार केवल कार्य तर्कों में काम करता है, न कि टुपल्स के अंदर।

>>> def foo(a, b, c): 
...  print a, b, c 
... 
>>> data = (1, 2, 3) 
>>> foo(*data) 
1 2 3 

>>> foo((*data,)) 
    File "<stdin>", line 1 
    foo((*data,)) 
     ^
SyntaxError: invalid syntax 
28

अपडेट: इस व्यवहार अजगर 3.5.0 में तय किया गया था, PEP-0448 देखें:

Unpacking टपल, सूची के अंदर की अनुमति दी जानी करने का प्रस्ताव है, सेट, और शब्दकोश प्रदर्शित करता है:

*range(4), 4 
# (0, 1, 2, 3, 4) 

[*range(4), 4] 
# [0, 1, 2, 3, 4] 

{*range(4), 4} 
# {0, 1, 2, 3, 4} 

{'x': 1, **{'y': 2}} 
# {'x': 1, 'y': 2} 
संबंधित मुद्दे