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

Как говорится:

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

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

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

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

Ответ 1

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

Я также заявляю, что, на мой взгляд, это противоречит духу 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 иногда указывает на проблему с дизайном.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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