TypeError: mendapat beberapa nilai untuk argumen

143

Saya membaca utas lain yang berkaitan dengan kesalahan ini dan tampaknya masalah saya memiliki perbedaan yang menarik dan berbeda dari semua posting yang saya baca sejauh ini, yaitu, semua posting lainnya sejauh ini memiliki kesalahan dalam hal salah satu pengguna yang dibuat kelas atau sumber daya sistem bawaan. Saya mengalami masalah ini ketika memanggil suatu fungsi, saya tidak tahu apa fungsinya. Ada ide?

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)

Pesan eror:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'
chopper draw lion4
sumber
5
Apa deklarasi Horizontol_drawboxfungsi? Jika dimulai dengan fillBox, maka itulah kesalahannya (ditetapkan satu kali dengan argumen posisi, dan kali kedua dengan argumen kata kunci).
Cilyan

Jawaban:

223

Ini terjadi ketika argumen kata kunci ditentukan yang menimpa argumen posisi. Misalnya, mari kita bayangkan sebuah fungsi yang menggambar kotak berwarna. Fungsi memilih warna yang akan digunakan dan mendelegasikan gambar kotak ke fungsi lain, menyampaikan semua argumen tambahan.

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

Lalu telepon

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

akan gagal karena dua nilai ditugaskan ke color: "blellow"sebagai posisi dan "green"sebagai kata kunci. ( painter.draw_boxseharusnya menerima heightdan widthargumen).

Ini mudah dilihat dalam contoh, tetapi tentu saja jika seseorang mencampurkan argumen saat dipanggil, mungkin tidak mudah untuk melakukan debug:

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

Di sini, colorditugaskan 20, lalu args=[30]dan colorlagi ditugaskan "green".

Cilyan
sumber
Menarik - ketika saya menemukan kesalahan ini, itu juga tentang colorargumen. Masalahnya sedikit berbeda - model_matrixargumen saya menjadi hanya kata kunci, dan beberapa kode lawas berlalu sebagai argumen posisional. API baru mengharapkan color, dan malah mendapatkan matriks 4x4.
Tomasz Gandor
Hai, saya tidak mengerti untuk contoh kedua. Hal ini juga memenuhi kondisi: When a keyword argument is specified that overwrites a positional argument. Tapi mengapa yang terakhir bisa bekerja? Apa aturannya ketika python menetapkan argumen. Terima kasih.
Alston
2
@Stallman: contoh kedua yang saya berikan juga tidak berfungsi. color = 20 konflik dengan color = "green". Aturan penugasan diberikan setelahnya. Info lebih lanjut: docs.python.org/3/tutorial/controlflow.html#keyword-arguments Terutama yang ke-3 dari 4 contoh "panggilan tidak sah".
Cilyan
70

Saya memiliki masalah yang sama yang benar-benar mudah dibuat, tetapi perlu waktu beberapa saat untuk melihat.

Saya telah menyalin deklarasi ke tempat saya menggunakannya dan telah meninggalkan argumen 'diri' di sana, tetapi butuh waktu lama untuk menyadari hal itu.

Saya punya

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

tapi seharusnya begitu

self.myFunction(a, b, c='123')
Q --- sepuluh
sumber
1
Atau ganti dulu selfdengan nama kelas. ;)
Tomasz Gandor
49

Ini juga terjadi jika Anda lupa selfdeklarasi di dalam metode kelas.

Contoh:

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

Gagal menyebutnya seperti self.is_overlapping(x1=2, x2=4, y1=3, y2=5) dengan:

{TypeError} is_overlapping () mendapat beberapa nilai untuk argumen 'x1'

KARYA :

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)
gies0r
sumber
Komentar ini membantu saya mengenali masalah saya: Saya lupa menambahkan selfargumen di dalam deklarasi fungsi. yaitu apa yang seharusnya def myFunction(self, a, b, c='123')ditulis sebagai def myFunction(a, b, c='123'). Dan karena bmengambil daftar dan cmengambil skalar, ketika hilang sendiri argumen kacau dan akhirnya input bmasuk c, menyebabkan kesalahan "beberapa argumen". Saya membuat kesalahan ini karena saya menguji metode internal ini di luar kelas dan lupa menambahkan selfkembali. Semoga bermanfaat bagi orang lain!
yuqli
@yuqli Ini persis bagaimana saya masuk ke masalah ini juga. ;) Senang mendengar bahwa pos ini membantu Anda.
gies0r
1
menyelamatkan saya beberapa waktu juga :)
nexla
Juga berfungsi setelah mendekorasi fungsi @staticmethodyang mungkin merupakan pendekatan yang lebih baik ketika selftidak diperlukan secara inheren.
ayorgo
21

Masalah saya mirip dengan Q --- sepuluh, tetapi dalam kasus saya adalah bahwa saya lupa untuk memberikan argumen diri ke fungsi kelas:

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

Harus menjadi

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

Implementasi yang salah ini sulit dilihat ketika memanggil metode kelas sebagai:

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

Yang akan menghasilkan a TypeError: got multiple values for argument. Mudah-mudahan, sisa jawaban di sini cukup jelas bagi siapa saja untuk dapat dengan cepat memahami dan memperbaiki kesalahan. Jika tidak, harap jawaban ini membantu Anda!

Andreas Forslöw
sumber
2
oh man, lupa "diri" adalah masalah saya juga, pengecualian yang menyesatkan untuk dilemparkan
pcko1
3

Sederhananya Anda tidak dapat melakukan hal berikut:

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

Karena Anda meneruskan variabel 'y' ke fungsi dua kali: sekali sebagai kwargs dan sekali sebagai deklarasi fungsi.

kuasipolinomial
sumber
2

Saya dibawa ke sini karena alasan yang tidak disebutkan secara eksplisit dalam jawaban sejauh ini, sehingga untuk menyelamatkan orang lain dari masalah:

Kesalahan juga terjadi jika argumen fungsi telah berubah urutan - untuk alasan yang sama seperti dalam jawaban yang diterima: argumen posisi bentrok dengan argumen kata kunci.

Dalam kasus saya itu karena urutan argumen set_axisfungsi Pandas berubah antara 0,20 dan 0,22:

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

Menggunakan contoh yang biasa ditemukan untuk set_axis menghasilkan kesalahan membingungkan ini, sejak saat Anda menelepon:

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

sebelum 0.22, ['a', 'b', 'c']ditugaskan ke sumbu karena itu argumen pertama, dan kemudian argumen posisional memberikan "beberapa nilai".

Heath Raftery
sumber