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

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

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माना जाता है heightऔर widthतर्क)।

उदाहरण में यह देखना आसान है, लेकिन यदि कोई कॉल पर बहस करता है, तो बहस करना आसान नहीं होगा:

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

यहाँ, colorसौंपा गया है 20, फिर args=[30]और colorफिर से सौंपा गया है "green"


दिलचस्प - जब मैंने इस त्रुटि को मारा, तो यह एक colorतर्क के बारे में भी था । मुद्दा थोड़ा अलग था - मेरा model_matrixतर्क केवल कीवर्ड बन गया था, और कुछ विरासत कोड ने इसे एक तर्कपूर्ण तर्क के रूप में पारित किया था। नए एपीआई की उम्मीद थी color, और इसके बजाय 4x4 मैट्रिक्स मिला।
टॉमस गैंडर

नमस्ते, मैं इसे दूसरे उदाहरण के लिए नहीं मिलता। यह भी स्थिति को संतुष्ट करता है When a keyword argument is specified that overwrites a positional argument:। लेकिन बाद वाला काम क्यों कर सकता है? जब अजगर तर्क देते हैं तो नियम क्या है। धन्यवाद।
एल्स्टन

2
@ स्टॉलमैन: मैंने जो दूसरा उदाहरण दिया, वह भी गैर-काम वाला है। रंग = रंग के साथ 20 संघर्ष = "हरा"। असाइनमेंट के लिए नियम के ठीक बाद दिया गया है। अधिक जानकारी: docs.python.org/3/tutorial/controlflow.html#keyword-arguments विशेष रूप से 4 "अमान्य कॉल" उदाहरणों में से 3।
16

70

मुझे वही समस्या थी जो वास्तव में बनाने में आसान है, लेकिन मुझे देखने में थोड़ा समय लगा।

मैंने उस घोषणा को कॉपी कर लिया था जहां मैं इसका उपयोग कर रहा था और वहां 'स्व' तर्क छोड़ दिया था, लेकिन मुझे यह महसूस करने में उम्र लग गई।

मैं था

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

लेकिन यह होना चाहिए था

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

1
या प्रथम selfश्रेणी नाम से प्रतिस्थापित करें। ;)
टॉमस गैंडर

49

यह तब भी होता है जब आप selfक्लास के तरीकों के अंदर घोषणा को भूल जाते हैं ।

उदाहरण:

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) साथ कॉल करने में विफल :

{TypeError} is_overlapping () को 'X1' तर्क के लिए कई मान मिले

काम करता है :

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किसी अन्य व्यक्ति के लिए मदद करना भूल गया था।
युक्ली

@#qli यह ठीक इसी तरह से मैं भी इस समस्या में हूँ। ;) यह सुनकर अच्छा लगा कि इस पोस्ट ने आपकी मदद की।
gies0r

1
मुझे कुछ समय के साथ ही बचा लिया :)
nexla

साथ ही फ़ंक्शन को सजाने के बाद काम करता है जिसके साथ @staticmethodएक बेहतर दृष्टिकोण हो सकता है जब selfस्वाभाविक रूप से आवश्यक नहीं होता है।
अयोर्गो

21

मेरा मुद्दा Q --- दस के समान था, लेकिन मेरे मामले में यह था कि मैं एक कक्षा समारोह में स्व तर्क प्रदान करना भूल गया था:

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)

जिससे उपज होगी TypeError: got multiple values for argument। उम्मीद है, बाकी के जवाब यहाँ स्पष्ट हैं कि किसी को भी जल्दी से समझने और त्रुटि को ठीक करने में सक्षम होना चाहिए। यदि नहीं, तो उम्मीद है कि यह उत्तर आपकी मदद करेगा!


2
ओह यार, "स्व" को भूल जाना भी मेरा मुद्दा था, जो एक भ्रामक अपवाद था
pcko1

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' को दो बार फ़ंक्शन में पास करते हैं: एक बार kwargs के रूप में और एक बार फ़ंक्शन घोषणा के रूप में।


2

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

त्रुटि तब भी होती है यदि फ़ंक्शन तर्कों ने क्रम बदल दिया है - उसी कारण जैसे कि स्वीकृत उत्तर में: स्थितिगत तर्क कीवर्ड तर्कों के साथ टकराते हैं।

मेरे मामले में ऐसा इसलिए था क्योंकि पंडों के set_axisसमारोह का तर्क क्रम 0.20 और 0.22 के बीच बदल गया था:

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

जब आप कॉल करते हैं, तो इस भ्रामक त्रुटि में set_axis परिणामों के लिए आमतौर पर पाए जाने वाले उदाहरणों का उपयोग करना:

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

0.22 से पहले, ['a', 'b', 'c']अक्ष को सौंपा गया है क्योंकि यह पहला तर्क है, और फिर स्थितीय तर्क "कई मान" प्रदान करता है।

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