2013-02-14 10 views
10

मैं कुछ अजगर कार्यों को इस तरह लिखा देखा है:कुछ पायथन कार्यों में तर्क सूची के चारों ओर कोष्ठक का एक अतिरिक्त सेट क्यों है?

def get_year((year,prefix,index,suffix)): 
    return year 

कैसे है कि इस तरह अतिरिक्त कोष्ठकों के बिना अन्य कार्यों से (यदि सभी) कैसे भिन्न होता है:

def do_format(yr,pfx,id,sfx): 
    return "%s %s %s/%s"%(yr, id, pfx, sfx) 

या यह बस है शैलियों में स्वाद का मामला, या यदि वे भिन्न हैं, तो get_year() को मौजूदा कॉलर के वाक्यविन्यास को प्रभावित किए बिना do_format() या इसके विपरीत की शैली में फिर से लिखा जा सकता है?

+3

टपल खोल, OLE स्टैंडबाय। –

+4

ध्यान दें कि यह सुविधा, धन्यवाद, पाइथन 3 में चली गई है। – delnan

उत्तर

7

अपने उदाहरण में get_year समारोह एक स्वचालित रूप से पैक टपल पैरामीटर (इस सुविधा अजगर 3 से चला गया है) का उपयोग करता है। इसे कॉल करने के लिए, आप इसे एक पैरामीटर देते हैं, और वह पैरामीटर अनुक्रम होने की उम्मीद है जिसमें चार मान होते हैं।

# Invocation 
my_input = [2013, 'a', 'b', 'c'] # sequence does NOT have to be a tuple! 
my_year = get_year(my_input) # returns 2013 

अजगर 3 के लिए इस पुनर्लेखन लेकिन मंगलाचरण बदल (दूसरे शब्दों में, मौजूदा कोड है जो get_year कॉल नहीं तोड़ करने के लिए) नहीं करने के लिए:

def get_year(input_sequence): 
    year, prefix, index, suffix = input_sequence 
    return year 
ऊपर

अनिवार्य रूप से क्या टपल unpacking के लिए कर रहा है आप स्वचालित रूप से इस विशेष मामले में, आप बस

def get_year(input_sequence): 
    return input_sequence[0] 

लिख सकता है अधिक जानकारी के लिए PEP 3113 पढ़ें।

+0

+1 बिल्कुल सही। अब मुझे लगता है कि ओपी वास्तव में क्या पूछ रहा था। ऐसा लगता है कि मैं खुद उलझन में था। :(क्षमा करें OP। –

+0

अभी तक मैं केवल पायथन 2.7 पर काम कर रहा था। लेकिन अब मुझे लगता है कि यह वास्तव में जाने का समय है पायथन 3.x पर :) –

10

पहला फ़ंक्शन एक एकल ट्यूपल तर्क लेता है, जबकि दूसरा फ़ंक्शन 4 तर्क लेता है। आप उन पैरामीटर को अलग-अलग पास कर सकते हैं, या splat ऑपरेटर के साथ एक टुपल के रूप में, जो व्यक्तिगत पैरामीटर में टुपल को अनपैक कर देगा।

उदा:

# Valid Invocations 
print do_format(*('2001', '234', '12', '123')) # Tuple Unpacking 
print do_format('2001', '234', '12', '123')  # Separate Parameter 
print get_year(('2001', '234', '12', '123')) 

# Invalid invocation. 
print do_format(('2001', '234', '12', '123')) # Passes tuple 
+0

आप उस सुविधा का उपयोग न करने के लिए टुपल अनपॅकिंग फ़ंक्शन को फिर से लिखेंगे? – WilliamKF

+0

@ विलियमकेएफ। मुझे समझ में नहीं आता क्या विशेषता है? यदि आप अनपॅकिंग टुपल नहीं करना चाहते हैं, तो बस उन्हें पहले फ़ंक्शन के रूप में टुपल के रूप में पास करें। –

+0

@WilliamKF 'do_format' के रूप में 'get_year' लिखने के लिए, बस उन ब्रैकेट को हटा दें। बस इतना ही। –

1

ये सब बराबर हैं (फोन करने वाले को बदलने के लिए नहीं होगा):

# 2.x unpacks tuple as part of the function call, 3.x raises exception 
def get_year((year,prefix,index,suffix)): 
    """get year from (year, prefix, index, suffix) tuple""" 
    return year 

# 2.x and 3.x, you unpack tuple in the function call 
def get_year(year_tuple): 
    """get year from (year, prefix, index, suffix) tuple""" 
    year, prefix, index, suffix = year_tuple 
    return year 

# 2.x and 3.x, speedier because you don't unpack what you don't need 
def get_year(year_tuple): 
    """get year from (year, prefix, index, suffix) tuple""" 
    return year_tuple[0] 
संबंधित मुद्दे