শ্রেণি পদ্ধতিটি "TypeError উত্পন্ন করে:… কীওয়ার্ড আর্গুমেন্টের জন্য একাধিক মান পেয়েছে ..."


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
নুরেটিন

উত্তর:


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>

আপনি দেখতে পাচ্ছেন যে 'জিনিস' ক্লাসের 'মাইফু' ক্লাসের 'ফু' জন্য একটি রেফারেন্স বরাদ্দ করা হয়েছে। ডক্সের এই বিভাগটি ব্যাখ্যা করে যে কীভাবে ফাংশন আর্গুমেন্টগুলি আরও কিছু কাজ করে।


1
দ্রষ্টব্য: আপনার ফাংশন ডিফটিতে প্রথম প্যারামিটার হিসাবে নিজেকে অন্তর্ভুক্ত করা হলে আপনি একই ধরণের ত্রুটি পেতে পারেন এবং তারপরে আপনি ঘটনাক্রমে নিজেটিকে প্রথম পরামিতি হিসাবে কল করেন।
ক্রিস্টোফার হান্টার

48

শিক্ষামূলক পোস্টের জন্য ধন্যবাদ। আমি কেবল একটি নোট রাখতে চাই যে আপনি যদি "টাইপএরর: ফুডো () কীওয়ার্ড আর্গুমেন্ট 'জিনিস' এর জন্য একাধিক মান পেয়ে থাকেন তবে এমনও হতে পারে আপনি ভুলভাবে প্যারামিটার হিসাবে 'সেলফ' পাশ করছিলেন ফাংশনটি কল করা (সম্ভবত কারণ আপনি ক্লাস ঘোষণার থেকে লাইনটি অনুলিপি করেছেন - তাড়াহুড়া করার সময় এটি একটি সাধারণ ত্রুটি)।


7
আমার সাথে যা ঘটেছে, এই উত্তরটি যুক্ত করার জন্য ধন্যবাদ। এটি করা আরও সাধারণ ভুল হতে পারে, এ কারণেই আপনি আমার উত্সাহ পেতে চলেছেন।
rdrey

একই দেখা দেয় যখন একটি ওভারলোডিং @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

ফাংশনে কেবল 'স্ট্যাটিকমেডোথার' সাজসজ্জার যুক্ত করুন এবং সমস্যাটি স্থির হয়েছে

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
ড্রেভিকো

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)

যেহেতু আমাদের তিনটি পরামিতি রয়েছে:

a হল পজিশনাল প্যারামিটার

b = 1 হ'ল কীওয়ার্ড এবং ডিফল্ট প্যারামিটার

* আরগগুলি পরিবর্তনশীল দৈর্ঘ্যের পরামিতি

সুতরাং আমরা প্রথমে একটি পজিশনাল প্যারামিটার হিসাবে অর্পণ করি, এর অর্থ আমাদের এর অবস্থান ক্রমে অবস্থানগত যুক্তির মান প্রদান করতে হবে, এখানে আদেশের বিষয়টি। তবে আমরা কলিং ফাংশনটি ইন-এর জায়গায় আর্গুমেন্ট 1 দিয়ে যাচ্ছি এবং তারপরে আমরা কী-ওয়ার্ড আর্গুমেন্ট হিসাবে বিবেচনা করে একটিকে মান প্রদান করব। এখন একটি দুটি মান আছে:

একটি হল অবস্থানগত মান: a = 1

দ্বিতীয়টি হ'ল মূলশব্দযুক্ত মান যা এক = 12

সমাধান

আমরা পরিবর্তন করতে হবে hello(1, 2, 3, 4,a=12)করতে hello(1, 2, 3, 4,12) তাই এখন একটি মাত্র একজন অবস্থানগত মান যা 1 এবং b মান 2 পেতে এবং মূল্যবোধের বিশ্রাম * args (পরিবর্তনশীল দৈর্ঘ্য প্যারামিটার) পেতে হবে পাবেন

অতিরিক্ত তথ্য

আমরা যদি চাই যে * টির জন্য 2,3,4 এবং একটিটি 1 এবং খ 12 পাওয়া উচিত 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 দ্বারা কভার করা হয়েছে - আপনার উদাহরণে একই পরামিতি রয়েছে (ক) অবস্থান দ্বারা নির্ধারিত এবং স্পষ্টভাবে নাম দ্বারা ly
ড্যানিও

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'
>>> 

"আগুন "টিকে 'বার' যুক্তিতে গ্রহণ করা হয়েছে। এবং তবুও কোয়ার্গে উপস্থিত রয়েছে আরও একটি 'বার' যুক্তি।

আপনাকে কিওয়ার্ডগুলি থেকে পদ্ধতিতে পাস করার আগে কীওয়ার্ড যুক্তিটি মুছে ফেলতে হবে।


1

এছাড়াও জাজাগোতে এটি ঘটতে পারে যদি আপনি ইউআরএল করতে jquery এজ্যাক্স ব্যবহার করেন যা কোনও ফাংশনে 'অনুরোধ' প্যারামিটার ধারণ করে না তবে তার বিপরীতে থাকে

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


def myfunc(foo, bar):
    ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.