Подтвердить что ты не робот

Перегруженные функции в python?

Возможно ли иметь перегруженные функции в Python? В С# я бы сделал что-то вроде

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}

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

4b9b3361

Ответ 1

EDIT. Для новых общих функций отправки в Python 3.4 см. http://www.python.org/dev/peps/pep-0443/

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

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it 5, so enter the 'else' clause

Ответ 2

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

def myfunction(first, second, *args):
    # args is a tuple of extra arguments

def myfunction(first, second, third=None):
    # third is optional

однако, если вы действительно хотите это сделать, вы, безусловно, можете заставить его работать (рискуя оскорбить традиционалистов; o). Короче говоря, вы должны написать функцию wrapper(*args), которая проверяет количество аргументов и делегатов по мере необходимости. такой "взлом" обычно делается через декораторы. в этом случае вы могли бы достичь чего-то вроде:

from typing import overload

@overload
def myfunction(first):
    ....

@myfunction.overload
def myfunction(first, second):
    ....

@myfunction.overload
def myfunction(first, second, third):
    ....

и вы реализуете это, если функция overload(first_fn) (или конструктор) возвращает вызываемый объект, где метод __call__(*args) содержит объяснение, описанное выше, и метод overload(another_fn) добавляет дополнительные функции, которые могут быть делегированы.

вы можете увидеть пример чего-то подобного здесь http://acooke.org/pytyp/pytyp.spec.dispatch.html, но это методы перегрузки по типу. это очень похожий подход...

UPDATE: и что-то подобное (используя типы аргументов) добавляется в python 3 - http://www.python.org/dev/peps/pep-0443/

Ответ 3

Да, это возможно. Я написал код ниже в Python 3.2.1:

def overload(*functions):
    return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)

Использование:

myfunction=overload(no_arg_func, one_arg_func, two_arg_func)

Обратите внимание, что лямбда, возвращаемая функциями overload, выбирает функцию для вызова в зависимости от количества аргументов без имени.

Решение не является совершенным, но на данный момент я не могу написать ничего лучшего.

Ответ 4

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

Python является динамическим. Если вы не знаете, что может сделать объект, просто попробуйте: и вызовите на него метод, за исключением: ошибок.

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

Ответ 5

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

Я пробовал что-то для своих случаев использования, это может помочь понять людей, чтобы перегрузить методы.

Давайте рассмотрим пример в одном из потоков stackoverflow:

метод перегрузки класса с вызовом методов из другого класса.

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

передать аргументы из удаленного класса:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

ИЛИ add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

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

попробуйте для своих кодов