TypeError: bağımsız değişken için birden çok değer aldı


143

Bu hatayla ilgili diğer konuları okudum ve sorunumun şu ana kadar okuduğum tüm gönderilerden ilginç bir farklılığı var gibi görünüyor, yani şu ana kadar diğer tüm gönderiler bir kullanıcının oluşturduğu bir hataya sahip sınıf veya yerleşik bir sistem kaynağı. Bir işlevi çağırırken bu sorunu yaşıyorum, bunun ne için olabileceğini anlayamıyorum. Herhangi bir fikir?

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)

Hata mesajı:

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

5
Horizontol_drawboxFonksiyonun beyanı nedir ? İle başlıyorsa fillBox, bu hata (bir kez konumsal bağımsız değişkenle ve ikinci kez anahtar sözcük bağımsız değişkeni ile atanır).
Cilyan

Yanıtlar:


224

Bu, konumsal bir argümanın üzerine yazan bir anahtar kelime argümanı belirtildiğinde olur. Örneğin, renkli bir kutu çizen bir fonksiyon düşünelim. İşlev, kullanılacak rengi seçer ve tüm ekstra argümanları aktararak kutunun çizimini başka bir işleve devreder.

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

Sonra çağrı

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

iki değer atandığından başarısız olur color: "blellow"konumsal ve "green"anahtar sözcük olarak. ( ve argümanlarını painter.draw_boxkabul etmesi beklenir ).heightwidth

Örnekte bunu görmek kolaydır, ancak elbette çağrı sırasında argümanlar karıştırılırsa, hata ayıklamak kolay olmayabilir:

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

Burada coloratanır 20sonra args=[30]ve colortekrar atanır "green".


İlginç - bu hataya çarptığımda, aynı zamanda bir colortartışma ile ilgiliydi . Sorun biraz farklıydı - benim model_matrixargümanım yalnızca anahtar kelime haline geldi ve bazı eski kodlar onu konumsal bir argüman olarak geçirdi. Yeni API bekliyordu colorve bunun yerine 4x4 matrisi aldı.
Tomasz Gandor

Merhaba, ikinci örnek için anlamadım. Aynı zamanda tatmin koşulu: When a keyword argument is specified that overwrites a positional argument. Ama ikincisi neden işe yarayabilir? Python argümanları atadığında kural nedir? Teşekkür ederim.
Alston

2
@Stallman: Verdiğim ikinci örnek de çalışmayan bir örnek. color = 20, color = "green" ile çakışır. Atama kuralı hemen sonra verilir. Daha fazla bilgi: docs.python.org/3/tutorial/controlflow.html#keyword-arguments Özellikle 4 "geçersiz çağrı" örneklerinden 3'üncü.
Cilyan

71

Yapması gerçekten kolay olan aynı problemi yaşadım, ancak bunu anlamam biraz zaman aldı.

Beyanı kullandığım yere kopyalamış ve 'öz' argümanını orada bırakmıştım, ancak bunu anlamam yıllar aldı.

sahiptim

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

ama olmalıydı

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

1
Veya ilkini selfsınıf adıyla değiştirin . ;)
Tomasz Gandor

49

Bu, selfsınıf yöntemleri içindeki bildirimi unutursanız da olur .

Misal:

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

Şunun gibi arama başarısızself.is_overlapping(x1=2, x2=4, y1=3, y2=5) :

{TypeError} is_overlapping (), 'x1' bağımsız değişkeni için birden çok değer aldı

İŞLER :

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)

Bu yorum sorunumu belirlememe yardımcı oluyor: selfİşlev bildiriminin içine bir argüman eklemeyi unutuyorum . ne olması gerektiği yani def myFunction(self, a, b, c='123')olarak yazılmıştır def myFunction(a, b, c='123'). Ve çünkü bbir listesini alır ve cöz berbat argümanları ve nihayetinde girişi olmayan zaman, bir sayıl alır bgider c"çoklu argümanlar" hataya neden. Bu hatayı yapıyorum çünkü bu dahili yöntemi sınıf dışında test ettim ve selfgeri eklemeyi unuttum . Umarım başkası için yararlıdır!
yuqli

@yuqli Ben de bu soruna tam olarak böyle giriyorum. ;) Bu gönderinin size yardımcı olduğunu duymak güzel.
gies0r

1
bana epey zaman kazandırdı :)
nexla

Ayrıca , doğası gereği gerekli olmadığında @staticmethoddaha iyi bir yaklaşım olabilecek işlevi süsledikten sonra da çalışır self.
ayorgo

22

Sorunum Q --- on'a benziyordu, ancak benim durumumda bir sınıf işlevine öz argüman sağlamayı unutmuştum:

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

Olmalı

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

Sınıf yöntemini şu şekilde çağırırken bu hatalı uygulamayı görmek zordur:

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

Hangi bir TypeError: got multiple values for argument. Umarım buradaki cevapların geri kalanı, herhangi birinin hatayı hızlı bir şekilde anlayıp düzeltebilmesi için yeterince açıktır. Değilse, bu cevabın size yardımcı olacağını umuyoruz!


2
ah adamım, "kendini" unutmak da benim
sorunumdu

3

Basitçe söylemek gerekirse, aşağıdakileri yapamazsınız:

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

Çünkü 'y' değişkenini işleve iki kez geçirirsiniz: biri kwargs olarak ve bir kez de işlev bildirimi olarak.


2

Buraya şu ana kadar cevaplarda açıkça belirtilmeyen bir nedenle getirildim, böylece başkalarını sıkıntıdan kurtarmak için:

Hata, işlev bağımsız değişkenlerinin sırasını değiştirdiğinde de ortaya çıkar - kabul edilen yanıtla aynı nedenle: konumsal bağımsız değişkenler anahtar sözcük bağımsız değişkenleriyle çakışır.

Benim durumumda bunun nedeni Pandas set_axisişlevinin bağımsız değişken sırasının 0.20 ile 0.22 arasında değişmesiydi:

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

Set_axis için yaygın olarak bulunan örnekleri kullanmak bu kafa karıştırıcı hataya neden olur, çünkü aradığınızda:

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

0.22'den önce, ['a', 'b', 'c']eksene atanır çünkü bu ilk argümandır ve daha sonra konumsal argüman "çoklu değerler" sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.