Вопрос проверяет понимание того, как Python обрабатывает функции и чем он отличается от языков со статической типизацией.
В Python нельзя перегружать функции только по сигнатуре, как в Java или C++. Последнее объявление функции перезаписывает предыдущее. Для похожего поведения используют аргументы по умолчанию, проверку типов или functools.singledispatch. Это позволяет реализовать похожую логику, но другим способом.
Python не поддерживает перегрузку функций в классическом виде.
Определение:
Перегрузка функций (function overloading) — это возможность иметь несколько функций с одинаковым именем, но разными параметрами.
Пример:
def foo(x):
return x
def foo(x, y):
return x + y
В Python останется только вторая версия функции.
Причина:
функции являются объектами
имя просто указывает на последний объект
Используют несколько подходов.
def foo(x, y=None):
if y is None:
return x
return x + y
def foo(x):
if isinstance(x, str):
return x.upper()
return x * 2
from functools import singledispatch
@singledispatch
def func(x):
raise NotImplementedError()
@func.register(int)
def _(x):
return x * 2
Это часто спрашивают на собеседованиях, потому что:
Показывает понимание динамической типизации
Показывает знание стандартной библиотеки
В Python нет перегрузки функций по сигнатурам. Аналогичное поведение достигается через аргументы по умолчанию, проверки типов и singledispatch.