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


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

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

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

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

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

5 60

5 ответов:

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

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

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

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

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

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

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

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

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