2010-11-09 12 views
14

पायथन में, मैं समझता हूं कि डिफ़ॉल्ट तर्क अंत में आते हैं और गैर-डिफ़ॉल्ट तर्क डिफ़ॉल्ट तर्क का पालन नहीं कर सकते हैं। यह ठीक है। उदाहरण के लिए:डिफ़ॉल्ट और गैर-डिफ़ॉल्ट तर्कों का आदेश

>>> def foo(x=0, y): 
     return x, y 
SyntaxError: non-default argument follows default argument 

यह अपेक्षाकृत ठीक है।

हालांकि, जब मैं चाहता हूं कि पहला तर्क एक डिफ़ॉल्ट एक होना चाहिए? उदाहरण के लिए, जैसा उपर्युक्त कोड से स्पष्ट है, x को पहला तर्क होना चाहिए और इसका 0 का डिफ़ॉल्ट मान होना चाहिए।

क्या ऐसा करना संभव है? मैं पूछ रहा हूँ क्योंकि भले range समारोह में, मैं यह कुछ इस तरह है अनुमान लगा रहा हूँ:

def range(start=0, end): 
    pass 

तो यह कैसे किया जाता है और यदि यह संभव नहीं है, यह कैसे range द्वारा कार्यान्वित किया जाता? ध्यान दें कि मैं डिफ़ॉल्ट होने के पहले तर्क पर जोर दे रहा हूं, यह संपूर्ण बिंदु है। मैं उदाहरण के रूप में range का उपयोग कर रहा हूं क्योंकि यह मेरी समस्या को पूरी तरह से फिट करता है। बेशक कोई rangedef range(end, start=0) के रूप में लागू कर सकता है, लेकिन यह बात नहीं है।

उत्तर

9

खैर, range सी कोड जो इस थोड़ा बेहतर कर सकते हैं कर सकते हैं। वैसे भी, आप यह कर सकते हैं:

def range(start, stop=None): 
    if stop is None: # only one arg, treat stop as start ... 
     stop = start 
     start = 0 
    ... 

और तदनुसार फ़ंक्शन को दस्तावेज़ करें।

+1

मेरे उत्तर के लगभग समान, लेकिन स्पष्ट और पांच मिनट पहले। तो, +1। –

+0

अंतर्निहित के साथ स्थिरता के लिए 'चरण' तर्क जोड़ना चाहता है। –

+0

+1। यह उत्तम है। मैं बेवकूफ महसूस नहीं कर रहा हूँ। – user225312

1

आप अपवाद अपने आप को संभाल अगर आप वास्तव में चाहते हैं कि

def Range(start=0, end=None): 
    if end is None: 
     raise AttributeError("end value not specified") 
    pass 
2

यह range द्वारा लागू नहीं किया गया है। आप *args या **args का उपयोग कर सकते हैं और जैसा कि आप चाहते हैं tuple या dict treat का इलाज कर सकते हैं। उदाहरण के लिए:

 
def f(*args): 
    if len(args) == 1: 
    print "assuming the first is default" 
    elif len(args) == 2: 
    print "two arguments were passed" 
    else: 
    print "Complaining" 

2

कुछ दृष्टिकोण हैं। पहला तर्क फ़ंक्शन में तर्कों को स्विच करना होगा, यदि कुछ तर्क "कोई नहीं" हैं। यह इस तरह काम करेगा।

def range1(value, end=None): 
    if end == None: 
     end = value 
     value = 0 
    return _generate_range_values(value, end) 

अन्य प्राथमिक विधि यह होगा कि आपके कार्य को प्राप्त होने वाले सभी तर्कों की एक सूची प्राप्त हो। फिर यह तय कर सकता है कि तर्कों की संख्या के आधार पर क्या करना है।

def range2(*args): 
    if len(args) == 1: 
     start = 0 
     end = int(args[0]) 
    elif len(args) == 2: 
     start = int(args[0]) 
     end = int(args[1]) 
    return _generate_range_values(start, end) 

तीसरा उपयोगकर्ताओं को आपके कार्य में नामित तर्क देने के लिए प्रोत्साहित करना होगा, जिससे ऑर्डर कम महत्वपूर्ण हो जाता है।

def range3(end, start=0): 
    return _generate_range_values(start, end) 

फिर उन नामित शुरू तर्क से कॉल करने के लिए जब वे (0. के अलावा कुछ करना चाहता था हालांकि नामित तर्क आवश्यकता नहीं होगी, यह कोड साफ़ रखता होगा।

for i in range3(55, start=12) 
+0

+1 भले ही मुझे समझ में नहीं आ रहा है कि आपको 'int() '' args (x' '' range2() 'में 'int()' का उपयोग करने की आवश्यकता क्यों महसूस हुई, लेकिन दूसरों में नहीं। यह जरूरी नहीं है (हालांकि यह उस संस्करण को फ्लोटिंग पॉइंट और स्ट्रिंग तर्कों को स्वीकार करने की अनुमति देता है जैसे '3.14' और' 42 "')। – martineau

+0

वापस देखकर, मुझे यकीन नहीं है कि मैंने उदाहरणों में से एक में int() क्यों उपयोग किया था, न कि दूसरों को। बिल्टिन रेंज() फ़ंक्शन एक त्रुटि उत्पन्न करेगा यदि यह पूर्णांक तर्कों के अलावा कुछ भी प्राप्त करता है। –

1

मैं डॉन ' टी श्रृंखला के लिए कोड है, लेकिन मैं यह चाल इस तरह का प्रदर्शन करती है कुछ कर रहा हूँ:

def range(start, stop=None, step=1): 
    if stop is None: 
     start, stop = 0, start 
    ... 

संपादित करें: कोड मार्टिन्यू की टिप्पणी प्रति ठीक कर दिया।

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