Перегруженные функции в python?
Возможно ли иметь перегруженные функции в Python? В С# я бы сделал что-то вроде
void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
а затем, когда я вызываю функцию, он будет различать два из них в зависимости от количества аргументов. Возможно ли сделать что-то подобное в Python?
Ответы
Ответ 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']}
Итак, обработка выполняется для списка, словаря или примитивных переменных из перегрузки метода.
попробуйте для своих кодов