पाइथन, चर लंबाई स्थितीय तर्कों के बाद डिफ़ॉल्ट कीवर्ड तर्क


82

मुझे लगा कि मैं पायथन 2 में एक फ़ंक्शन कॉल में चर-लंबाई स्थितीय मापदंडों के बाद नामित मापदंडों का उपयोग कर सकता हूं, लेकिन मुझे SyntaxErrorपायथन वर्ग का आयात करते समय मिलता है । मैं निम्नलिखित "get" विधि के साथ लिख रहा हूं, उदाहरण के लिए:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

त्रुटि दिखती है:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

मैं विधि को कई तरीकों से कॉल करने में सक्षम होना चाहता हूं:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

आदि।

जवाबों:


71

यह काम करता है, लेकिन केवल पायथन 3 में । पीईपी 3102 देखें । "नया क्या है" दस्तावेजों पर नज़र रखने से, ऐसा लगता है कि कोई 2.x बैकपोर्ट नहीं है, इसलिए आप भाग्य से बाहर हैं। आपको किसी भी कीवर्ड तर्क ( **kwargs) को स्वीकार करना होगा और इसे मैन्युअल रूप से पार्स करना होगा। आप d.get(k, default)या तो प्राप्त करने के लिए उपयोग कर सकते हैं d[k]या defaultयदि ऐसा नहीं है। एक तर्क को निकालने के लिए kwargs, जैसे कि सुपर क्लास की विधि को कॉल करने से पहले, उपयोग करें d.pop


ध्यान दें कि में def get(self, *args, raw=False, vars=None):, raw=Falseऔर vars=Noneकीवर्ड तर्क के साथ कोई लेना देना नहीं है। वे डिफ़ॉल्ट तर्क मान हैं। डिफ़ॉल्ट मान के साथ तर्क को स्थिति में पास किया जा सकता है, और डिफ़ॉल्ट मान के बिना तर्क कीवर्ड द्वारा पारित किया जा सकता है:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

इसी तरह, डिफ़ॉल्ट मान रखने के लिए केवल-कीवर्ड तर्कों की आवश्यकता नहीं होती है। इस *argsतर्क के बाद आ रहा है कि उन्हें केवल कीवर्ड के रूप में चिह्नित किया जाए, डिफ़ॉल्ट मान की उपस्थिति नहीं:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

आप और इमरान दोनों को धन्यवाद! इमरान के कोड ब्लॉक और डॉकस्ट्रिंग सुझाव के साथ आपके जवाब ने सवाल का पूरी तरह से जवाब दिया।
जमैकाक

50

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

यह कीवर्ड तर्कों के लिए डिफ़ॉल्ट मान प्रदान करने के लिए एक सामान्य पैटर्न है, साथ ही किसी भी स्थिति संबंधी तर्क देने की अनुमति देता है:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

यदि आप अतिरिक्त खोजशब्द तर्कों का उपयोग नहीं करते हैं, तो आपको चिंता करने की कोई बात नहीं है। यह फ़ंक्शन को थोड़ा कम स्व-दस्तावेजीकरण बनाता है, जिसे आप ठीक से लिखे गए डॉकस्ट्रिंग के साथ बना सकते हैं।

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