अजगर में ** का क्या नाम है?


59

जब पायथन प्रोग्रामिंग करते हैं तो मैं कभी-कभी **रूपांतरण करने के लिए करता हूं । मैं समझता हूं कि यह क्या करता है लेकिन मैं किन डेटा संरचनाओं में हेरफेर कर रहा हूं? A dictऔर दूसरा क्या है? एक array? क्या **ऑपरेटर का कोई नाम है ?


3
घातांक संचालक?
रूक

12
इसके दो अर्थ हैं **। शक्ति और "कीवर्ड तर्क शब्दकोश"। आप किसके बारे में बात कर रहे हैं? दस्तावेज़ में ये शब्द हैं: "यदि फॉर्म" ** पहचानकर्ता "मौजूद है, तो इसे किसी भी अतिरिक्त कीवर्ड तर्क प्राप्त करने वाले नए शब्दकोश में आरम्भ किया जाता है, जो नए खाली शब्दकोश में डिफ़ॉल्ट होता है।" उनमें से कौन सा आपके प्रश्न के लिए प्रासंगिक लगता है?
एस.लॉट

"कीवर्ड तर्क शब्दकोश" वह था जिसके बारे में मैं पूछ रहा हूं। टिप्पणियों के लिए धन्यवाद।
निकलैस रोसेंक्रांटज

जवाबों:


86

यह एक ऑपरेटर के रूप में ऐसा नहीं है, इसलिए इसका वास्तव में नाम नहीं है, लेकिन इसे "सिंटेक्टिक नियम" के रूप में परिभाषित किया गया है । तो इसे बुलाया जाना चाहिए:

  • "कीवर्ड तर्क सिंटैक्स को अनपैक कर रहा है"

यदि आपके पास तर्कों की एक सूची है, *argsतो इसे "तर्क अनपैकिंग"**kwargs कहा जाता है , उसी तरह "कीवर्ड तर्क अनपैकिंग" कहा जाता है ।

यदि आप इसे बाएं हाथ की तरफ से उपयोग करते हैं =, तो जैसा a, *middle, end = my_tupleकि आप कहेंगे, "टपल अनपैकिंग"

कुल मिलाकर, तीन प्रकार के (एकल पैरामीटर) तर्क हैं:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*argsतर्क "चर स्थितीय पैरामीटर" और कहा जाता है **kwargs"चर कीवर्ड पैरामीटर" है। कीवर्ड-ओनली दलीलों को स्थितिगत रूप से नहीं दिया जा सकता है, क्योंकि एक चर स्थितीय पैरामीटर आपके द्वारा पारित सभी तर्कों को ले जाएगा।

यह अधिकांश पीईपी 0362 और 3102 में पाया जा सकता है , साथ ही डॉक्स के नियंत्रण प्रवाह अनुभाग में भी। हालांकि यह ध्यान दिया जाना चाहिए कि फ़ंक्शन हस्ताक्षर ऑब्जेक्ट PEP केवल एक मसौदा है, और शब्दावली केवल एक व्यक्ति का विचार हो सकता है। लेकिन वे वैसे भी अच्छे पद हैं। :)

तो तर्क *और **तर्क सिर्फ अपने संबंधित डेटा संरचनाओं को अनपैक करते हैं:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[१]: Iterables ऑब्जेक्ट हैं जो __iter__()विधि को लागू करते हैं और मैपिंग ऑब्जेक्ट हैं जो कार्यान्वित करते हैं keys()और __getitem__()। कोई भी वस्तु जो इस प्रोटोकॉल का समर्थन करती है, उसे निर्माणकर्ताओं द्वारा समझा जाएगा tuple()और dict(), इसलिए उनका उपयोग तर्क-वितर्क के लिए किया जा सकता है।


3
यदि कोई अन्य व्यक्ति भ्रमित है, def f(x, *xs, y=0): passतो मान्य नहीं है पायथन 2. {5,6,7} वाक्य रचना, और न ही वह def f(x, y=0, *xs):करें जो आप उम्मीद कर सकते हैं। AFAIK, (स्पष्ट) इच्छित प्रभाव को प्राप्त करने का एकमात्र तरीका है def f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...। अजगर 3 उम्मीद के मुताबिक मूल सिंटैक्स संभालता है।
चब्रोने

1
जब हम इस पर हैं: begin, *middle, end = (0, 1, 2, 3, 4, 5)वाक्यविन्यास 2.x या तो पायथन में काम नहीं करता है।
स्टेफानो पलाज़ो

पायथन 3.5 और बाद में यह उत्तर गलत है। PEP-448 ** ऑपरेटर को शब्दकोश अनपैकिंग ऑपरेटर के रूप में निर्दिष्ट करता है। Python.org/dev/peps/pep-0448
devnul3

13

मुझे नहीं लगता कि इसका कोई नाम है। में अजगर डॉक्स के तहत "तर्क सूचियाँ अनपैक", यह सिर्फ के रूप में भेजा है " **-operator।"

मुझे यकीन नहीं है कि आप "दूसरे" डेटा संरचना से क्या मतलब है। जब आप f(**kwargs)डिक्शनरी kwargsको कुंजी-मूल्य जोड़े के अनुक्रम के रूप में अनपैक करते हैं । मुझे नहीं लगता कि इसमें कोई अन्य संरचना शामिल है।

मैं स्पष्टता के लिए उपरोक्त दस्तावेज में उदाहरण की नकल करूंगा ।

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

इसे भी देखें: * args और ** kwargs का क्या मतलब है?


कई संभव तरीके हैं जिनसे एक पाठक व्याख्या कर सकता है f(**kwargs)...
हिरण हंटर

3

यदि आप अनिश्चित हैं कि किसी विशेष ऑपरेटर को कॉल करने के लिए या यदि यह अनाम है, तो आप हमेशा वाका वाका बैंग स्पलैट का सहारा ले सकते हैं जो आपको यह पता लगाने में मदद करता है कि इसे क्या कहा जाए। इस मामले में **मैं इसे कॉल करूंगा double-splat, हालांकि प्रतीकों के लिए कुछ वैकल्पिक नाम हैं

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