Скажем, я определяю следующий класс:
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
Как правило, один экземпляр этого класса будет реализован одним из следующих способов:
>>> MyClass(1,2)
<__main__.MyClass object at 0x8acbf8c>
>>> MyClass(1, y=2)
<__main__.MyClass object at 0x8acbeac>
>>> MyClass(x=1, y=2)
<__main__.MyClass object at 0x8acbf8c>
>>> MyClass(y=2, x=1)
<__main__.MyClass object at 0x8acbeac>
Это просто отлично и денди.
Теперь мы попробуем с недопустимым аргументом ключевого слова и посмотрим, что произойдет:
>>> MyClass(x=1, j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'j'
Python правильно вызывает ошибку типа и жалуется на unexpected keyword argument 'j'.
Теперь мы можем попробовать с двумя недопустимыми аргументами ключевого слова:
>>> MyClass(i=1,j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
Обратите внимание, что два аргумента ключевого слова были недопустимыми, но Python только жалуется на один из них, 'i' в этом случае.
Позволяет изменить порядок неверных аргументов ключевого слова:
>>> MyClass(j=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
Это интересно. Я изменил порядок неверных аргументов ключевого слова, но Python по-прежнему решает жаловаться на 'i', а не 'j'. Таким образом, Python явно не просто выбирает первый недопустимый ключ, чтобы жаловаться.
Давайте попробуем еще немного:
>>> MyClass(c=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(q=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
В алфавитном порядке я пробовал письмо до i и один после i, поэтому Python не жалуется в алфавитном порядке.
Вот еще несколько, на этот раз с i в первой позиции:
>>> MyClass(i=1, j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(i=1, b=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(i=1, a=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'a'
Ага! Я получил жалобу на 'a' вместо 'i'.
Мой вопрос в том, когда недопустимые аргументы ключевого слова присваиваются конструктору класса, как Python определяет, на кого жаловаться?