TypeError: আর্গুমেন্টের জন্য একাধিক মান পেয়েছে


143

আমি এই ত্রুটিটি সহ অন্যান্য থ্রেডগুলি পড়েছিলাম এবং মনে হয় যে এ পর্যন্ত আমার পড়া সমস্ত পোস্টের তুলনায় আমার সমস্যাটির একটি আকর্ষণীয় স্বতন্ত্র পার্থক্য রয়েছে, যথা, অন্য যে সমস্ত পোস্ট এখনও পর্যন্ত তৈরি হয়েছে সেগুলির ক্ষেত্রে ত্রুটি রয়েছে শ্রেণি বা বিল্টিন সিস্টেম সংস্থান। কোনও ফাংশন কল করার সময় আমি এই সমস্যাটি অনুভব করছি, আমি কী করতে পারি তা বুঝতে পারি না। কোন ধারনা?

BOX_LENGTH = 100
turtle.speed(0)
fill = 0
for i in range(8):
    fill += 1
    if fill % 2 == 0:
        Horizontol_drawbox(BOX_LENGTH, fillBox = False)
    else:
        Horizontol_drawbox(BOX_LENGTH, fillBox = True)

    for i in range(8):
        fill += 1
        if fill % 2 == 0:
            Vertical_drawbox(BOX_LENGTH,fillBox = False)
        else:
            Vertical_drawbox(BOX_LENGTH,fillBox = True)

ভুল বার্তা:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'

5
Horizontol_drawboxকর্মের ঘোষণা কি ? যদি এটি দিয়ে শুরু হয় fillBox, তবে এটি ত্রুটি (অবস্থানগত যুক্তির সাথে এক সময় নির্ধারিত, এবং দ্বিতীয় বার কীওয়ার্ড আর্গুমেন্ট সহ)।
সিলিয়ান

উত্তর:


223

যখন কোনও কীওয়ার্ড আর্গুমেন্ট নির্দিষ্ট করা হয় যা একটি অবস্থানগত আর্গুমেন্টকে ওভাররাইট করে es উদাহরণস্বরূপ, আসুন এমন কোনও ফাংশনটি কল্পনা করুন যা রঙিন বাক্স আঁকবে। ফাংশনটি ব্যবহার করার জন্য রঙটি নির্বাচন করে এবং বাক্সের অঙ্কনকে অন্য ফাংশনে প্রতিনিধিত্ব করে, সমস্ত অতিরিক্ত যুক্তি রিলে করে।

def color_box(color, *args, **kwargs):
    painter.select_color(color)
    painter.draw_box(*args, **kwargs)

তারপরে কল

color_box("blellow", color="green", height=20, width=30)

ব্যর্থ হবে কারণ দুটি মান নির্ধারিত হয়েছে color: "blellow"অবস্থানগত এবং "green"মূলশব্দ হিসাবে। ( যুক্তি এবং তর্কগুলি painter.draw_boxগ্রহণ করার কথা )।heightwidth

উদাহরণে এটি দেখতে সহজ, তবে অবশ্যই যদি কেউ ডাকে আর্গুমেন্টগুলি মিশিয়ে দেয় তবে ডিবাগ করা সহজ হতে পারে না:

# misplaced height and width
color_box(20, 30, color="green")

এখানে, তারপর colorবরাদ্দ করা হয় 20, args=[30]এবং colorআবার নিয়োগ করা হয় "green"


আকর্ষণীয় - যখন আমি এই ত্রুটিটি আঘাত করি তখন এটি একটি colorযুক্তি সম্পর্কেও ছিল । বিষয়টি কিছুটা আলাদা ছিল - আমার model_matrixযুক্তিটি কেবল-কিওয়ার্ডে পরিণত হয়েছিল এবং কিছু লিগ্যাসি কোড এটি অবস্থানগত আর্গুমেন্ট হিসাবে পাস করেছিল passed নতুন এপিআই আশা করেছিল colorএবং পরিবর্তে একটি 4x4 ম্যাট্রিক্স পেয়েছে।
টমাসজ গ্যান্ডর

হাই, আমি এটি দ্বিতীয় উদাহরণের জন্য পাই না। এছাড়া সন্তুষ্ট অবস্থা: When a keyword argument is specified that overwrites a positional argument। তবে পরেরটি কেন কাজ করতে পারে? অজগরটি যখন আর্গুমেন্টগুলি নির্ধারণ করে তখন কি নিয়ম। ধন্যবাদ.
অ্যালস্টন

2
@ স্টলম্যান: আমি যে দ্বিতীয় উদাহরণটি দিয়েছি তাও একটি অ-কর্মহীন is রঙ = রঙের সাথে 20 টি বিবাদ = "সবুজ"। নিয়োগের নিয়মটি ঠিক পরে দেওয়া আছে। আরও তথ্য: ডকস.পিথন.আর. / ৩ / টিউটোরিয়াল / কন্ট্রোলফ্লো। Html# কীওয়ার্ড- আরগমেন্টস বিশেষত ৪ টি "অবৈধ কল" উদাহরণগুলির মধ্যে।
সিলিয়ান

70

আমার একই সমস্যাটি ছিল যা তৈরি করা সত্যিই সহজ, তবে এটি দেখার জন্য আমাকে কিছুটা সময় নিয়েছিল।

আমি যে ঘোষণাপত্রটি এটি ব্যবহার করেছিলাম সেখানে অনুলিপি করেছিলাম এবং সেখানে 'স্ব' যুক্তি রেখে দিয়েছিলাম, কিন্তু এটি বুঝতে আমার বয়স হতে হয়েছিল ages

আমার ছিল

self.myFunction(self, a, b, c='123')

কিন্তু এটা করা উচিত ছিল

self.myFunction(a, b, c='123')

1
বা selfশ্রেণীর নামের সাথে প্রথমে প্রতিস্থাপন করুন । ;)
টমাসজ গ্যান্ডর

49

selfক্লাস পদ্ধতিগুলির মধ্যে ঘোষণাটি ভুলে গেলে এটিও ঘটে happens

উদাহরণ:

class Example():
    def is_overlapping(x1, x2, y1, y2):
        # Thanks to https://stackoverflow.com/a/12888920/940592
        return max(x1, y1) <= min(x2, y2)

এটির self.is_overlapping(x1=2, x2=4, y1=3, y2=5) সাথে এটির কল করতে ব্যর্থ :

'X1' আর্গুমেন্টের জন্য E TypeError 1 is_overlapping () একাধিক মান পেয়েছে

কাজগুলি :

class Example():
    def is_overlapping(self, x1, x2, y1, y2):
        # Thanks to https://stackoverflow.com/a/12888920/940592
        return max(x1, y1) <= min(x2, y2)

এই মন্তব্যটি আমাকে আমার সমস্যা চিহ্নিত করতে সহায়তা করে: আমি selfফাংশন ঘোষণার ভিতরে যুক্তি যুক্ত করতে ভুলে যাই । অর্থাত্ কী def myFunction(self, a, b, c='123')হিসাবে লেখা উচিত ছিল def myFunction(a, b, c='123')। এবং কারণ bএকটি তালিকা cনেয় এবং একটি স্কেলার নেয়, যখন নিজেকে হারিয়ে আর্গুমেন্টগুলি গণ্ডগোল করে এবং অবশেষে ইনপুটটি bযায় c, "একাধিক যুক্তি" ত্রুটির কারণ হয়। আমি এই ভুলটি করেছি কারণ আমি শ্রেণীর বাইরে এই অভ্যন্তরীণ পদ্ধতিটি পরীক্ষা করেছি এবং selfপিছনে যুক্ত করতে ভুলে গেছি Hope অন্য কারও জন্য সহায়ক বলে আশা করি!
yuqli

@yuqli ঠিক এইভাবেই আমি এই সমস্যায় পড়ি। ;) শুনে ভাল লাগল যে এই পোস্টটি আপনাকে সহায়তা করেছে।
gies0r

1
আমাকে বেশ কিছুটা সময় বাঁচিয়েছে :)
নেক্সলা

এছাড়াও ফাংশনটি সজ্জিত করার পরে কাজ করে @staticmethodযা selfসহজাতভাবে যখন প্রয়োজন হয় না তখন আরও ভাল পদ্ধতির হতে পারে ।
অায়োরগো

21

আমার ইস্যুটি কিউ টেনের মতোই ছিল, তবে আমার ক্ষেত্রে এটি ছিল যে আমি কোনও শ্রেণীর অনুষ্ঠানে স্ব-যুক্তি সরবরাহ করতে ভুলে গিয়েছিলাম:

class A:
    def fn(a, b, c=True):
        pass

হয়ে উঠতে হবে

class A:
    def fn(self, a, b, c=True):
        pass

এই ত্রুটিযুক্ত বাস্তবায়ন ক্লাস পদ্ধতিটি হিসাবে কল করার সময় এটি দেখতে শক্ত:

a_obj = A()
a.fn(a_val, b_val, c=False)

যা ফল দেবে a TypeError: got multiple values for argument। আশা করি, এখানে বাকি উত্তরগুলি যে কেউ তাত্ক্ষণিকভাবে বুঝতে এবং সমাধান করতে সক্ষম হওয়ার পক্ষে যথেষ্ট স্পষ্ট। যদি না হয়, আশা করি এই উত্তরটি আপনাকে সহায়তা করবে!


2
ওহে মানুষ, "স্ব" ভুলে
যাওয়াও

3

সহজ কথায় আপনি নিম্নলিখিতটি করতে পারবেন না:

class C(object):
    def x(self, y, **kwargs):
        # Which y to use, kwargs or declaration? 
        pass

c = C()
y = "Arbitrary value"
kwargs["y"] = "Arbitrary value"
c.x(y, **kwargs) # FAILS

কারণ আপনি ভেরিয়েবল 'y' দুটি বার ফাংশনে পাস করেছেন: একবার কোয়ার্গস হিসাবে এবং একবার ফাংশন ঘোষণার হিসাবে।


2

আমাকে অন্যের ঝামেলা বাঁচানোর জন্য এতক্ষণে উত্তরে সুস্পষ্টভাবে উল্লেখ না করার কারণে এখানে নিয়ে আসা হয়েছিল:

ত্রুটিটিও ঘটে যদি ফাংশন আর্গুমেন্টগুলি অর্ডার পরিবর্তন করে - গ্রহণিত উত্তরের মতো একই কারণে: অবস্থানগত আর্গুমেন্টগুলি মূলশব্দ যুক্তিগুলির সাথে সংঘর্ষ হয়।

আমার ক্ষেত্রে এটি ছিল কারণ পান্ডাস set_axisফাংশনের যুক্তির আদেশটি 0.20 এবং 0.22 এর মধ্যে পরিবর্তিত হয়েছিল:

0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)

সেট_এক্সিসের ফলাফলগুলির জন্য সাধারণভাবে পাওয়া উদাহরণগুলি এই বিভ্রান্তিকর ত্রুটির ক্ষেত্রে ব্যবহার করা, যেহেতু আপনি কল করেছেন:

df.set_axis(['a', 'b', 'c'], axis=1)

0.22 এর আগে ['a', 'b', 'c']অক্ষকে বরাদ্দ করা হয় কারণ এটি প্রথম যুক্তি, এবং তারপরে অবস্থানগত যুক্তি "একাধিক মান" সরবরাহ করে।

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