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



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



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


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

1407   5  

5 ответов:

редактировать для новых универсальных функций single dispatch в Python 3.4 см. http://www.python.org/dev/peps/pep-0443/

обычно вам не нужно перегружать функции в 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's 5, so enter the 'else' clause

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

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/

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

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

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

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

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

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

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

давайте возьмем пример использования в одном из потоков 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']}

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

попробуйте ваш код

Comments

    Ничего не найдено.