फ़ंक्शन तर्कों में नंगे तारांकन चिह्न?


242

एक फ़ंक्शन के तर्कों में एक नंगे तारांकन क्या करता है?

जब मैंने अचार मॉड्यूल को देखा, तो मैंने यह देखा :

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

मैं एक एकल और डबल तारांकन पूर्व तर्कों के बारे में जानता हूं (तर्कों की चर संख्या के लिए), लेकिन इससे पहले कुछ भी नहीं है। और मुझे पूरा यकीन है कि इसका अचार से कोई लेना-देना नहीं है। शायद ऐसा होने का सिर्फ एक उदाहरण है। मैंने इसका नाम केवल तभी सीखा जब मैंने दुभाषिये के पास भेजा:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

अगर यह मायने रखता है, तो मैं अजगर 3.3.0 पर हूं।


जवाबों:


221

नंगे *ताकि आप के साथ एक समारोह को परिभाषित नहीं कर सकते हैं - नामित तर्क का उपयोग करने के फोन करने वाले के लिए मजबूर किया जाता है *जब आप कोई कीवर्ड तर्क निम्नलिखित है एक तर्क के रूप।

देखें क्या यह उत्तर या अजगर 3 प्रलेखन अधिक जानकारी के लिए।


3
ध्यान दें कि सभी स्थितिगत (अनाम) तर्क, सहित *args, नंगे से पहले होने चाहिए *
बॉलपॉइंटबैन

4
यह भी ध्यान दें कि एक प्रतिपक्ष की तरह है, /, जो स्थिति-केवल तर्कों के अंत को दर्शाता है ( stackoverflow.com/questions/28243832/… )।
स्टीफन

2
@ बॉलपॉइंटबैन: इसके *स्थान पर है *args, और इसके विपरीत; वे एक हस्ताक्षर में सह-अस्तित्व नहीं रख सकते। इसलिए उन्होंने चुना *; इससे पहले, *argsविशुद्ध रूप से स्थितीय तर्कों को लागू करने का एकमात्र तरीका था, और इसने उन तर्कों के अंत को चिह्नित किया, जिन्हें स्थितिगत रूप से पारित किया जा सकता है (चूंकि यह सभी शेष स्थितीय तर्क एकत्र करता है, वे निम्नलिखित नामित तर्कों तक पहुंच सकते हैं)। *इसका अर्थ है "समान तर्क वितर्क यहां से आगे नहीं जा सकता", लेकिन एक नाम की कमी का अर्थ है "लेकिन मैं उन्हें बिल्कुल भी स्वीकार नहीं करूंगा, क्योंकि मैंने उन्हें डालने के लिए जगह प्रदान नहीं की"।
शैडो रेंजर

70

जबकि मूल उत्तर प्रश्न का पूरी तरह से उत्तर देता है, बस संबंधित जानकारी का एक सा जोड़ रहा है। एकल तारांकन के लिए व्यवहार से प्राप्त होता है PEP-3102। संबंधित अनुभाग का हवाला देते हुए:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

    def compare(a, b, *, key=None):
        ...

सरल अंग्रेजी में, इसका मतलब है कि कुंजी के लिए मान पारित करने के लिए, आपको इसे स्पष्ट रूप से पास करना होगा key="value"


ओह, यह चीजों को बहुत स्पष्ट करता है। तो वास्तव में एक तर्क होना * केवल एक तर्क होने जैसा है *, लेकिन जब से आपने इसे कुछ भी नाम नहीं दिया है, इसका एकमात्र प्रभाव संभवतः शेष सभी तर्कपूर्ण तर्कों को शांत करना है, ताकि शेष तर्कों को कीवर्ड बनाने के लिए मजबूर किया जा सके। -केवल।
स्टीफन

11
@ स्टेपेन मैं भी मूल रूप से सोचा था, नंगे *का प्रभाव शेष स्थितीय तर्कों को टटोलने के लिए है, लेकिन ऐसा नहीं है। फंक्शन की अपेक्षा एक्स्ट्रा पोज़िशनल आर्ग्युमेंट्स पास करना, इस तरह की त्रुटि देता है:foo() takes exactly 1 positional argument (2 given)
अजय एम

19
def func(*, a, b):
    print(a)
    print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

ऊपर उदाहरण के साथ ** kwargs

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}

6

शब्दार्थ, इसका मतलब यह है कि निम्नलिखित तर्क केवल खोजशब्द हैं, इसलिए यदि आप इसके नाम को निर्दिष्ट किए बिना तर्क प्रदान करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी। उदाहरण के लिए:

>>> def f(a, *, b):
...     return a + b
...
>>> f(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 2 were given
>>> f(1, b=2)
3

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

उदाहरण के लिए sorted(nums, reverse=True)बनाम अगर आपने लिखा है sorted(nums, True)। उत्तरार्द्ध बहुत कम पठनीय होगा, इसलिए पायथन डेवलपर्स ने आपको इसे पूर्व तरीके से लिखने के लिए चुना।


4

मान लीजिए कि आपके पास फ़ंक्शन है:

def sum(a,key=5):
    return a + key 

आप इस फ़ंक्शन को 2 तरीकों से कॉल कर सकते हैं:

sum(1,2) या sum(1,key=2)

मान लीजिए कि आप फ़ंक्शन sumको केवल कीवर्ड तर्कों का उपयोग करके कॉल करना चाहते हैं ।

आप *स्थितीय तर्कों के अंत को चिह्नित करने के लिए फ़ंक्शन पैरामीटर सूची में जोड़ते हैं ।

तो समारोह के रूप में परिभाषित:

def sum(a,*,key=5):
    return a + key 

केवल उपयोग करके बुलाया जा सकता है sum(1,key=2)


-1

मैंने निम्नलिखित लिंक को बहुत उपयोगी समझा है *, *argsऔर **kwargs:

https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

आवश्यक रूप से, उपरोक्त उत्तरों के अलावा, मैंने उपरोक्त साइट से सीखा है (क्रेडिट: https://pythontips.com/author/yasoob008/ ) निम्नलिखित:

पहले नीचे दिए गए प्रदर्शन फ़ंक्शन के साथ, दो उदाहरण हैं, एक के साथ *argsऔर एक के साथ**kwargs

def test_args_kwargs(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

तो *argsआपको गतिशील रूप से उन तर्कों की एक सूची बनाने की अनुमति देता है जो उन्हें खिलाए जाने वाले क्रम में लिए जाएंगे, जबकि **kwargsNAMED तर्कों को पारित करने में सक्षम कर सकते हैं, और NAME द्वारा तदनुसार संसाधित किया जा सकता है (उस आदेश के बावजूद जिसमें उन्हें खिलाया गया है। ।

साइट जारी है, यह देखते हुए कि तर्कों का सही क्रम होना चाहिए:

some_func(fargs,*args,**kwargs)

2
इस जवाब का सवाल से कोई लेना देना नहीं है। यह एक अप्रचलित अजगर संस्करण का उपयोग कर रहा है जिसमें सुविधा नहीं है।
एंटटी हापाला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.