मदद () आउटपुट में स्लैश का क्या अर्थ है?


148

समापन कोष्ठक से पहले /पायथन 3.4 के helpआउटपुट में क्या मतलब rangeहै?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...

जवाबों:


185

यह केवल पैरामीटर के मापदंडों को समाप्त करता है, जो आप कीवर्ड मापदंडों के रूप में उपयोग नहीं कर सकते हैं । पायथन 3.8 से पहले, ऐसे पैरामीटर केवल सी एपीआई में निर्दिष्ट किए जा सकते हैं।

इसका अर्थ है कि keyतर्क को __contains__केवल स्थिति ( range(5).__contains__(3)) द्वारा पारित किया जा सकता है , न कि एक खोजशब्द तर्क ( range(5).__contains__(key=3)) के रूप में, कुछ ऐसा जो आप शुद्ध-अजगर कार्यों में स्थितीय तर्कों के साथ कर सकते हैं।

इसके अलावा तर्क क्लिनिक प्रलेखन देखें:

सभी मापदंडों को स्थिति-केवल तर्क क्लिनिक में चिह्नित करने के लिए /, अंतिम पैरामीटर के बाद अपने आप एक लाइन पर जोड़ें, पैरामीटर लाइनों के समान ही इंडेंट करें।

और (करने के लिए बहुत हाल ही में) अजगर पूछे जाने वाले प्रश्न :

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

सिंटैक्स अब पायथन भाषा विनिर्देश का हिस्सा है, संस्करण 3.8 के रूप में , PEP 570 - पायथन पोजिशनल-ओनली पैरामीटर्स देखें । PEP 570 से पहले, सिंटैक्स पहले से ही पायथन में संभावित भविष्य के समावेश के लिए आरक्षित था, PEP 457 - सिंटैक्स फॉर पॉज़िशनल-ओनली पैरामीटर्स देखें

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


22

यह सवाल मैंने खुद से पूछा। :) पता चला कि /मूल रूप से यहाँ Guido द्वारा प्रस्तावित किया गया था ।

वैकल्पिक प्रस्ताव: '/' का उपयोग कैसे करें? यह '*' के विपरीत है जिसका अर्थ है "कीवर्ड तर्क", और '/' एक नया चरित्र नहीं है।

तब उनका प्रस्ताव जीत गया

हे। अगर यह सच है, तो मेरा '/' प्रस्ताव जीत जाता है:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

मुझे लगता है कि इसे कवर करने वाला बहुत ही प्रासंगिक दस्तावेज PEP 570 है । जहां पर रिकैप सेक्शन अच्छा लगता है।

संक्षिप्त

उपयोग मामला निर्धारित करेगा कि फ़ंक्शन परिभाषा में किन मापदंडों का उपयोग करना है:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

मार्गदर्शन के रूप में:

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


यदि फ़ंक्शन समाप्त होता है /

def foo(p1, p2, /)

इसका मतलब है कि सभी कार्यात्मक तर्क स्थितिगत हैं।


6
/टोकन चुनना , क्योंकि "यह उलटा ऑपरेशन है *" दिखाता है, कि पायथन बस थोड़ा सा पागल है। यह एक प्रकार का सिन्थेसिया है।
टॉमस गैंडर

6

फ़ॉरवर्ड स्लैश (/) इंगित करता है कि इससे पहले के सभी तर्क केवल तर्कपूर्ण हैं। PEP 570 को स्वीकार किए जाने के बाद पाइथन 3.8 में पोजिशननल तर्कों को जोड़ा गया। प्रारंभ में इस अंकन को PEP 457 में परिभाषित किया गया था - पोजीशन-ओनली पैरामीटर्स के लिए नोटेशन की सूचना

फ़ंक्शन परिभाषा में पैरामीटर पूर्व फॉरवर्ड स्लैश (/) केवल स्थितीय हैं और स्लैश (/) द्वारा पीछा किए गए पैरामीटर सिंटैक्स के अनुसार किसी भी प्रकार के हो सकते हैं। जहां तर्कों को केवल एक फ़ंक्शन को कॉल करने पर उनकी स्थिति के आधार पर केवल मापदंडों को स्थित करने के लिए मैप किया जाता है। कीवर्ड (नाम) द्वारा केवल स्थिति-संबंधी पैरामीटर पास करना अमान्य है।

आइए निम्नलिखित उदाहरण लेते हैं

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

यहाँ उपरोक्त फ़ंक्शन परिभाषा में पैरामीटर a और b स्थिति-केवल हैं, जबकि x या y या तो स्थितीय या कीवर्ड हो सकते हैं।

निम्नलिखित फ़ंक्शन कॉल मान्य हैं

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

लेकिन, फंक्शन कॉल का पालन करना मान्य नहीं है, जो अपवाद को बढ़ाता है। एक के बाद से, बी को कीवर्ड के बजाय स्थितीय तर्क के रूप में पारित नहीं किया जाता है

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo () को कुछ स्थिति-संबंधी तर्क दिए गए जो कीवर्ड तर्क के रूप में पारित हुए: 'a, b'

अजगर में समारोह में निर्मित कई केवल तर्क को स्वीकार करते हैं जहां कीवर्ड द्वारा तर्क पारित करने का कोई मतलब नहीं है। उदाहरण के लिए अंतर्निहित फ़ंक्शन लेन केवल एक ही स्थिति (केवल) तर्क को स्वीकार करता है, जहां लेन को लेन के रूप में कहा जाता है (obj = "हैलो वर्ल्ड") पठनीयता की जांच करता है, मदद (लेन) की जांच करता है।

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

स्थितीय केवल पैरामीटर अंतर्निहित c / पुस्तकालय कार्यों को बनाए रखना आसान बनाते हैं। यह एपीआई का उपयोग करने वाले ग्राहक कोड को तोड़ने के जोखिम के बिना भविष्य में केवल परिवर्तनशील होने के लिए पैरामीटर के नाम के मापदंडों की अनुमति देता है

अंतिम लेकिन कम से कम, केवल स्थितीय पैरामीटर हमें उनके नामों का उपयोग करने की अनुमति देते हैं जिनका उपयोग परिवर्तनीय लंबाई कीवर्ड तर्कों में किया जा सकता है। निम्न उदाहरण देखें

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

पाइथन में फ़ंक्शन तर्क के प्रकारों में यहां स्थितीय केवल पैरामीटर बेहतर समझाया गया है : स्थिति केवल पैरामीटर

स्थिति-केवल पैरामीटर सिंटैक्स आधिकारिक तौर पर python3.8 में जोड़ा गया था। चेकआउट क्या नया python3.8 है - स्थिति केवल तर्क

पीईपी संबंधित: पीईपी 570 - पायथन पोजिशनल-ओनली पैरामीटर्स

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