Вводя в заблуждение(?) TypeError, когда передающие аргументы ключевого слова функции, определяемой с позиционными параметрами

В cPython 2.4:

def f(a,b,c,d):
    pass

>>> f(b=1,c=1,d=1)
TypeError: f() takes exactly 4 non-keyword arguments (0 given)

но:

>>> f(a=1,b=1,c=1)
TypeError: f() takes exactly 4 non-keyword arguments (3 given)

Очевидно, я действительно действительно не понимаю механизм обработки аргумента функции Python. Кто-либо хочет совместно использовать некоторый свет на этом? Я вижу то, что происходит (что-то как заполняющиеся слоты аргумента, затем сдаваясь), но я думаю, что это испортило бы новичка.

(также, если у людей есть лучшие ключевые слова вопроса - что-то как "кишки" - повторно отметьте),

8
задан Gregg Lind 1 February 2010 в 20:10
поделиться

1 ответ

Когда вы говорите

def f(a,b,c,d):

Вы говорите Python, что f занимает 4 позиционирование аргументов. Каждый раз, когда вы называете F F , он должен быть дан ровно 4 аргумента, и первое значение будет присвоено A , второе - b и т. Д.

Вам разрешено звонить f с чем-то вроде

f (1,2,3,4) или f (a = 1, b = 2, c = 3, d = 4) , или даже f (c = 3, b = 2, a = 1, d = 4)

, но во всех случаях именно 4 аргумента должны быть предоставлены.

f (b = 1, c = 1, d = 1) Возвращает ошибку, поскольку значение не было прилагается для A . (0 дано) f (a = 1, b = 1, c = 1) Возвращает ошибку, поскольку значение не было прилагается для D . (3 Дано)

Количество данных ARGS указывает на то, насколько далеко Python получил до реализации, есть ошибка.

Кстати, если вы говорите

def f(a=1,b=2,c=3,d=4):

, то ваши говорят Python, что F занимает 4 Дополнительные аргументы . Если определенный ARG не дан, то значение по умолчанию автоматически поставляется для вас. Тогда вы можете уйти с вызовом

F (a = 1, b = 1, c = 1) или f (b = 1, c = 1, d = 1)

13
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: