Байланысты: Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )
141 ПРИМЕЧАНИЕ Если вы используете значения по умолчанию, все параметры со значением по умолчанию должны
следовать после параметров, у которых значений по умолчанию нет . Это необходимо для того,
чтобы Python правильно интерпретировал позиционные аргументы .
Эквивалентные вызовы функций
Так как позиционные аргументы, именованные аргументы и значения по умол-
чанию могут использоваться одновременно, часто существуют несколько эквива-
лентных способов вызова функций. Возьмем оператор
describe_pets()
с одним
значением по умолчанию:
def describe_pet(pet_name, animal_type='dog'):
При таком определении аргумент для параметра
pet_name
должен задаваться в лю-
бом случае, но это значение может передаваться как в позиционном, так и в име-
нованном формате. Если описываемое животное не является собакой, то аргумент
animal_type
тоже должен быть включен в вызов, и этот аргумент тоже может быть
задан как в позиционном, так и в именованном формате.
Все следующие вызовы являются допустимыми для данной функции:
describe_pet('willie')
describe_pet(pet_name='willie')
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')
Все вызовы функции выдадут такой же результат, как и в предыдущих примерах.
ПРИМЕЧАНИЕ На самом деле не так важно, какой стиль вызова вы используете . Если ваша функция выдает нуж-
ный результат, выберите тот стиль, который вам кажется более понятным .
Предотвращение ошибок в аргументах
Не удивляйтесь, если на первых порах вашей работы с функциями будут встре-
чаться ошибки несоответствия аргументов. Такие ошибки происходят в том слу-
чае, если вы передали меньше или больше аргументов, чем необходимо функции
для выполнения ее работы. Например, вот что произойдет при попытке вызвать
describe_pet()
без аргументов:
def describe_pet(animal_type, pet_name):
"""Выводит информацию о животном."""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet()
142 Глава 8 • Функции
Python понимает, что при вызове функции часть информации отсутствует, и мы
видим это в данных трассировки:
Traceback (most recent call last):
File "pets.py", line 6, in
describe_pet()
TypeError: describe_pet() missing 2 required positional arguments:
'animal_
type' and 'pet_name'
В точке
сообщается местонахождение проблемы, чтобы вы поняли, что с вызовом
функции что-то пошло не так. В точке
приводится вызов функции, приведший
к ошибке. В точке
Python сообщает, что при вызове пропущены два аргумента,
и сообщает имена этих аргументов. Если бы функция размещалась в отдельном
файле, вероятно, вы смогли бы исправить вызов, и вам не пришлось бы открывать
этот файл и читать код функции.
Python помогает еще и тем, что он читает код функции и сообщает имена аргумен-
тов, которые необходимо передать при вызове. Это еще одна причина для того,
чтобы присваивать переменным и функциям содержательные имена. В этом случае
сообщения об ошибках Python принесут больше пользы как вам, так и любому
другому разработчику, который будет использовать ваш код.
Если при вызове будут переданы лишние аргументы, вы получите похожую
трассировку, которая поможет привести вызов функции в соответствие с ее
определением.