Перегрузка функций в Python: отсутствует

Как это говорит:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Перегрузка функций в Python отсутствует.

Насколько я чувствую, это большой недостаток, так как это также язык OO. Первоначально я обнаружил, что невозможно различить типы аргументов было сложно, но динамическая природа Python сделала это простым (например, список, кортежи, строки очень похожи).

Однако подсчет количества переданных аргументов, а затем выполнение работы - все равно что перебор.

5 ответов

Решение

Как было отмечено, аргументы ключевых слов со значениями по умолчанию могут иметь большое значение.

Я также утверждаю, что, по моему мнению, это противоречит духу Python - беспокоиться о том, какие типы передаются в методы. В Python, я думаю, более приемлемо использовать утиную типизацию - спрашивать, что может сделать объект, а не то, чем он является.

Таким образом, если ваш метод может принять строку или кортеж, вы можете сделать что-то вроде этого:

def print_names(names):
    """Takes a space-delimited string or an iterable"""
    try:
        for name in names.split(): # string case
            print name
    except AttributeError:
        for name in names:
            print name

Тогда вы можете сделать одно из следующих:

print_names("Ryan Billy")
print_names(("Ryan", "Billy"))

Хотя такой API иногда указывает на проблему с дизайном.

Теперь, если вы не пытаетесь писать код на C++ с использованием синтаксиса Python, для чего вам нужна перегрузка?

Я думаю, что с точностью до наоборот, перегрузка необходима только для того, чтобы заставить строго типизированные языки вести себя как Python. В Python у вас есть ключевое слово аргумент, у вас есть *args а также **kwargs,

Смотрите, например: Что такое чистый, питонский способ иметь несколько конструкторов в Python?

Вам не нужна перегрузка функций, так как у вас есть аргументы *args и **kwargs.

Дело в том, что перегрузка функций основана на идее, что при передаче разных типов вы будете выполнять другой код. Если у вас есть динамически типизированный язык, такой как python, вы не должны различать по типу, но вы должны иметь дело с интерфейсами и их соответствием написанному вами коду.

Например, если у вас есть код, который может обрабатывать либо целое число, либо список целых чисел, вы можете попробовать выполнить итерацию по нему, а если вы не можете, то вы предполагаете, что это целое число, и идете вперед. Конечно, это может быть float, но что касается поведения, если float и int кажутся одинаковыми, то их можно поменять местами.

Вы можете передать изменяемый тип данных контейнера в функцию, которая может содержать все, что вы хотите.

Если вам нужна другая функциональность, назовите функции по-разному или если U нужен один и тот же интерфейс, просто напишите интерфейсную функцию (или метод), которая вызывает функции соответствующим образом на основе полученных данных.

Мне потребовалось некоторое время, чтобы приспособиться к этому пришествию с Java, но это действительно не "большой гандикап"

Часто вы видите предложение использовать аргументы ключевого слова вместо значений по умолчанию. Посмотри на это.

Другие вопросы по тегам