वर्ग विधि "टाइपError:" उत्पन्न करती है ... कीवर्ड तर्क के लिए कई मान प्राप्त किए गए ... "


129

यदि मैं इस प्रकार एक कीवर्ड तर्क के साथ एक वर्ग विधि को परिभाषित करता हूं:

class foo(object):
  def foodo(thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

कॉलिंग विधि एक उत्पन्न करता है TypeError:

myfoo = foo()
myfoo.foodo(thing="something")

...
TypeError: foodo() got multiple values for keyword argument 'thing'

क्या चल रहा है?


1
आपको कभी भी इस बात का संतोषजनक जवाब नहीं मिलेगा कि स्पष्ट क्यों selfनिहितार्थ से बेहतर है this
nurettin

जवाबों:


163

समस्या यह है कि अजगर में कक्षा के तरीकों के लिए दिया गया पहला तर्क हमेशा उस वर्ग उदाहरण की एक प्रति है, जिस पर विधि को कहा जाता है, आमतौर पर लेबल किया जाता है self। यदि वर्ग इस प्रकार घोषित किया जाता है:

class foo(object):
  def foodo(self, thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

यह अपेक्षा के अनुरूप व्यवहार करता है।

स्पष्टीकरण:

selfपहले पैरामीटर के बिना , जब myfoo.foodo(thing="something")निष्पादित किया जाता है, तो foodoविधि को तर्कों के साथ कहा जाता है (myfoo, thing="something")। उदाहरण myfooतब सौंपा गया है thing(चूंकि thingपहला घोषित पैरामीटर है), लेकिन अजगर भी इसे असाइन "something"करने का प्रयास करता है thing, इसलिए अपवाद।

प्रदर्शित करने के लिए, मूल कोड के साथ इसे चलाने का प्रयास करें:

myfoo.foodo("something")
print
print myfoo

आप जैसे उत्पादन करेंगे:

<__main__.foo object at 0x321c290>
a thong is something

<__main__.foo object at 0x321c290>

आप देख सकते हैं कि 'चीज़' को कक्षा 'फू' के उदाहरण 'myfoo' के लिए निर्दिष्ट किया गया है। डॉक्स का यह खंड बताता है कि कैसे कार्य तर्क कुछ अधिक काम करते हैं।


1
ध्यान दें: यदि आप अपने फ़ंक्शन को पहले पैरामीटर के रूप में स्वयं शामिल करते हैं, तो आप उसी प्रकार की त्रुटि प्राप्त कर सकते हैं, और फिर आप गलती से फ़ंक्शन को भी पहले पैरामीटर के रूप में कहते हैं।
क्रिस्टोफर हंटर

48

शिक्षाप्रद पदों के लिए धन्यवाद। मैं बस एक नोट रखना चाहूंगा कि अगर आपको "टाइपर्रर: फूडो () कीवर्ड तर्क 'चीज' के लिए कई मान मिले हैं, तो यह भी हो सकता है कि जब आप गलती से 'सेल्फ' को पैरामीटर के रूप में पास कर रहे हों फ़ंक्शन को कॉल करना (शायद इसलिए कि आपने कक्षा की घोषणा से रेखा को कॉपी किया है - यह एक सामान्य त्रुटि है जब कोई जल्दी में होता है)।


7
यही मेरे साथ हुआ, इस उत्तर को जोड़ने के लिए धन्यवाद। यह बनाने के लिए और अधिक सामान्य गलती हो सकती है, यही कारण है कि आप मेरे उत्थान को प्राप्त कर रहे हैं।
22

ऐसा ही तब होता है जब ओवरलोडिंग @classmethod, समाधान केsuper().function(...) बजाय उपयोग किया जा रहा है <parentclass>.function(cls, ...)
एड्रैग

30

यह स्पष्ट हो सकता है, लेकिन यह किसी ऐसे व्यक्ति की मदद कर सकता है जिसने इसे पहले कभी नहीं देखा हो। यह नियमित कार्यों के लिए भी होता है यदि आप गलती से एक पैरामीटर को स्थिति से और स्पष्ट रूप से नाम से असाइन करते हैं।

>>> def foodo(thing=None, thong='not underwear'):
...     print thing if thing else "nothing"
...     print 'a thong is',thong
...
>>> foodo('something', thing='everything')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foodo() got multiple values for keyword argument 'thing'

6

फ़ंक्शन और समस्या के लिए बस 'staticmethod' डेकोरेटर जोड़ें

class foo(object):
    @staticmethod
    def foodo(thing=None, thong='not underwear'):
        print thing if thing else "nothing" 
        print 'a thong is',thong

मुझे बस यह त्रुटि मिली और इस समाधान ने मेरी समस्या हल कर दी। लेकिन क्या आप इस बात को बता सकते हैं कि इस डेकोरेटर ने इस समस्या को कैसे या क्यों हल किया?
रे

1
स्टेटमिथोड स्वयं को पहले तर्क के रूप में प्राप्त करने की विधि को रोकता है। तो अब, यदि आप कहते हैं, तो myfoo.foodo(thing="something")बात = "कुछ" पहले वाले तर्क को सौंपा जाएगा, बजाय निहित स्व तर्क के।
डैनियो

इसका मतलब यह भी है कि आप फ़ंक्शन के भीतर वर्ग चर का उपयोग नहीं कर सकते हैं, जो आमतौर पर के माध्यम से एक्सेस किया जाता हैself
drevicko

4

मैं एक और उत्तर जोड़ना चाहता हूं:

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

there is difference between parameter and argumentआप अजगर में यहां तर्क और पैरामीटर के बारे में विस्तार से पढ़ सकते हैं

def hello(a,b=1, *args):
   print(a, b, *args)


hello(1, 2, 3, 4,a=12)

चूंकि हमारे पास तीन पैरामीटर हैं:

एक स्थितीय पैरामीटर है

b = 1 कीवर्ड और डिफ़ॉल्ट पैरामीटर है

* आर्गेज चर लंबाई पैरामीटर है

इसलिए हम पहली बार स्थितीय पैरामीटर के रूप में असाइन करते हैं, इसका मतलब है कि हमें इसकी स्थिति के क्रम में स्थितीय तर्क के लिए मूल्य प्रदान करना है, यहां ऑर्डर की बात है। लेकिन हम कॉलिंग फ़ंक्शन के स्थान पर तर्क 1 पास कर रहे हैं और फिर हम कीवर्ड तर्क के रूप में मानकर, मूल्य प्रदान कर रहे हैं। अब दो मान हैं:

एक स्थितीय मूल्य है: a = 1

दूसरा कीवर्डेड मान है जो एक = 12 है

उपाय

हम परिवर्तन के लिए है hello(1, 2, 3, 4,a=12)करने के लिए hello(1, 2, 3, 4,12) तो अब एक केवल एक स्थितीय मूल्य जो 1 और बी 2 मूल्य मिलता है और शेष मान * args (चर लंबाई पैरामीटर) मिल जाएगा होगा मिल जाएगा

अतिरिक्त जानकारी

अगर हम चाहते हैं कि * args को 2,3,4 और एक को 1 और b को 12 मिलना चाहिए

तो हम इस तरह कर सकते हैं
def hello(a,*args,b=1): pass hello(1, 2, 3, 4,b=12)

कुछ और :

def hello(a,*c,b=1,**kwargs):
    print(b)
    print(c)
    print(a)
    print(kwargs)

hello(1,2,1,2,8,9,c=12)

आउटपुट:

1

(2, 1, 2, 8, 9)

1

{'c': 12}

यह पहले से ही उत्तर stackoverflow.com/a/31822875/12663 द्वारा कवर किया गया है - आपके उदाहरण में एक ही पैरामीटर (ए) स्थिति द्वारा निर्दिष्ट है और नाम से भी स्पष्ट है।
दानियो

3

यह त्रुटि तब भी हो सकती है जब आप एक कुंजी शब्द तर्क पास करते हैं जिसके लिए कुंजी में से एक समान (एक ही स्ट्रिंग नाम है) स्थितीय तर्क के लिए।

>>> class Foo():
...     def bar(self, bar, **kwargs):
...             print(bar)
... 
>>> kwgs = {"bar":"Barred", "jokes":"Another key word argument"}
>>> myfoo = Foo()
>>> myfoo.bar("fire", **kwgs)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bar() got multiple values for argument 'bar'
>>> 

"आग" को 'बार' तर्क में स्वीकार किया गया है। और फिर भी kwargs में एक और 'बार' तर्क मौजूद है।

आपको विधि से पास करने से पहले कीवर्ड तर्क को kwargs से निकालना होगा।


1

यह भी Django में हो सकता है यदि आप jquery ajax का उपयोग url के लिए कर रहे हैं जो एक फ़ंक्शन को उलट देता है जिसमें 'अनुरोध' पैरामीटर शामिल नहीं है

$.ajax({
  url: '{{ url_to_myfunc }}',
});


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