Розуміння перевантаження функцій у Python

Перевантаження функцій — це функція в деяких мовах програмування, яка дозволяє визначати варіанти однієї функції. Кожен варіант має однакову назву, але різні реалізації з унікальними функціональними підписами.

Ця техніка дозволяє виконувати різні операції залежно від типу та кількості аргументів, переданих функції.

На відміну від таких мов, як C++ і Java, Python не підтримує перевантаження функцій за замовчуванням, але є способи досягти подібної функціональності.

Як Python справляється з перевантаженням функцій?

У Python ви можете визначати ту саму функцію кілька разів з різними параметрами, типами даних або тим і іншим у кожному визначенні. Однак Python розпізнає лише останнє визначення функції, коли ви її викликаєте. Ось приклад:

 def arithmetics(a, b):
    return a - b

def arithmetics(a, b, c, d):
    return a + b - c * d

print(arithmetics(1, 2, 3, 5))
print(arithmetics(1, 2))

Об’єктно-орієнтовані мови, такі як Java, часто підтримують перевантаження функцій і методів. Метод — це просто функція, яку ви визначаєте всередині класу.

У наведеному вище коді Python розпізнає лише друге визначення функції arithmetics(), коли ви спробуєте викликати її у своєму проекті. Якщо ви спробуєте викликати функцію з двома аргументами, визначеними спочатку, ви отримаєте повідомлення про помилку «відсутні необхідні позиційні аргументи».

  5 розширень Wellness у новій вкладці Chrome для зміцнення психічного здоров’я та зняття стресу

Ви не отримаєте повідомлення про помилку, якщо викличете функцію з чотирма аргументами. Це означає, що Python перезаписав функцію її останнім екземпляром. Це не поведінка перевантаження, тому вам потрібно з цим боротися.

Отже, Python не обробляє перевантаження функцій за замовчуванням, але є деякі хитрощі, які можна використовувати, щоб імітувати його поведінку у ваших програмах.

Спосіб 1: Використання додаткових параметрів або аргументів за замовчуванням

Ви можете досягти перевантаження, визначивши функцію з аргументами за замовчуванням. Ось приклад:

 def arithmetics(a, b=0, c=0):
    """
    Arguments:
    a: The first number.
    b: The second number (optional).
    c: The third number (optional).
    """
    return a - b + c

Ця функція має три параметри, але два з них мають значення за замовчуванням. Це означає, що ви можете викликати його за допомогою від одного до трьох аргументів:

 print(arithmetics(1)) 
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4))

Хоча цей підхід дозволяє викликати функцію декількома різними способами, у довгостроковій перспективі він не дуже ефективний. Ось деякі з його обмежень:

  • Ви можете передавати лише цілі чи числа з плаваючою речовиною.
  • Немає істотних змін у поведінці функції. Наприклад, ви не можете змінити його поведінку, щоб обчислити площу фігури або навіть надрукувати Hello World.

Спосіб 2: Використання змінних аргументів

Щоб використовувати змінні аргументи для перевантаження функції в Python, ви повинні включити параметр args під час визначення вашої функції. Параметр args дозволяє передавати кілька позиційних аргументів під час виклику вашої функції. Ось приклад:

 def arithmetics(a, *args):
    """
    Arguments:
    a: The first number.
    *args: A variable number of arguments (optional).
    """
    args_sum = 0

    for num in args:
        args_sum *= num

    return a - args_sum

print(arithmetics(1))
print(arithmetics(2, 5))
print(arithmetics(10, 3, 4, 2, 4, 6))

Наведена вище функція приймає два аргументи: обов’язковий аргумент під назвою a та аргумент args, який дозволяє вводити скільки завгодно аргументів.

  Як виправити, що Cuphead не зберігає прогрес

Хоча вона може приймати кілька аргументів, наведена вище функція може виконувати операцію множення лише над змінними аргументами, тобто аргументами, представленими ключовим словом args.

Якщо ви хочете виконати кілька операцій, вам доведеться ввести умовні оператори у свій код, і це може швидко ускладнитися.

Спосіб 3: Використання декоратора кількох відправок

Декоратор кількох відправок — це бібліотека Python, яка дозволяє визначати кілька реалізацій або екземплярів однієї функції на основі типу її аргументів. Це означає, що ви можете визначити ту саму функцію з різними типами даних і повністю змінити її поведінку.

Щоб використовувати декоратор кількох розсилок, виконайте такі дії:

  • Встановіть multipledispath у вашому середовищі Python:
     pip install multipledispatch
  • Прикрасьте свої функції за допомогою декоратора @dispatch. Декоратор @dispatch — це декоратор Python, який дозволяє реалізувати множинне відправлення. Він автоматично відправляє відповідну функцію на основі аргументів, які ви їй передаєте. Ви можете використовувати декоратор @dispatch, дотримуючись цього шаблону:
     from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    def your_function(a, b, c, x):
        pass
        

  • Ось приклад, у якому використовується декоратор множинної відправки для перевантаження функцій у Python:

     from multipledispatch import dispatch

    @dispatch(int, int)
    def add(a, b):
        """
        Arguments:
        a: Any integer.
        b: Any integer.
        """
        return a + b

    @dispatch(int, list)
    def add(a, b):
        """
        Arguments:
        a: Any integer.
        b: Any Python list.
        """
        b.append(a)
        return b


    print(add(1, 2))


    print(add(1, [2, 3, 4, 5, 'w', 'done']))

    Наведений вище фрагмент коду визначає два екземпляри функції add(). Перший екземпляр приймає два цілі числа як аргументи та повертає їх суму.

      8 найкращих програм для віддаленого робочого столу для малого та середнього бізнесу

    Тим часом друга версія цієї функції приймає ціле число та список. Він додає ціле число до списку та повертає новий список.

    Цей підхід до перевантаження функцій у Python дає вам велику гнучкість, особливо якщо вам потрібно змінити поведінку вашого методу. Ви можете дізнатися більше з багаторазова відправна документація.

    Найкращий підхід до перевантаження функцій у Python

    Підхід до перевантаження функцій має залежати від того, чого ви намагаєтеся досягти. Якщо ви можете завершити своє завдання, використовуючи аргументи за замовчуванням або змінні, тоді декоратор кількох відправок може бути надмірним. Проте декоратор багаторазової відправки зазвичай є найкращим варіантом з огляду на його ефективність і точність.

    Цей декоратор забезпечує простий і гнучкий спосіб реалізації перевантаження функцій у Python. Він дозволяє визначати кілька реалізацій однієї функції на основі типу її аргументів.

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