Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Функции с разными типами параметров


Автор: ecspertiza 22.10.2011, 00:01
В питоне еще не силен, пытаюсь найти как определить допустим две ф-ции с одним именем ,но с разными типами параметров, объясню на примере (C++) если никто не против smile

допустим хочу определить ф-цию loadUserInfo() , могу сделать загрузку информации о пользователе по id или по его имени, стало быть в плюсах я написал так бы

Код


void loadUserInfo(int user_id){
блаблабла
}

void loadUserInfo(string user_id){
блаблабла
}



и стало быть при вызове ф-ции loadUserInfoв зависимости от типа параметра будет вызываться или первая ф-ция или вторая. Вопрос как это можно реализовать в питоне

нашел такой способ

Код

def loadUserInfo(user)
   if type(user) == 'int'
      loadInfoFromId()
   elif type(user) == 'string'
      loadInfoFromName()


но может можно элегантнее ?

Автор: Gunjy 22.10.2011, 20:12
Ну можно вынести проверку типа за пределы функции, то есть:

Код

def loadInfoFromId(user):
   pass

def loadInfoFromName(user):
   pass

if type(user) == int:
   loadInfoFromId(user)
elif type(user) == str:
   loadInfoFromName(user)


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

Автор: Backward 23.10.2011, 03:37
Можно воспользоваться этим http://code.activestate.com/recipes/577064-simple-function-overloading-with-decorator/

Автор: cutwater 23.10.2011, 12:20
Backward, можно, но это будет unpythonic.

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

Исходя из Вашего кода, я бы предложил следующий вариант

Код

def load_info_from_id(id): # Use PEP8
   pass
def load_info_from_name(name):   pass

def load_user_info(id=None, name=None):
    assert id is not None and name id is not None

    if id is not None:
        load_info_from_id(id)
    elif name is not None:
        load_info_from_name(name)


Хотя это тоже не лучший вариант, вам стоит пересмотреть подход к проектированию интерфейсов, перегрузка зачастую не нужна в python.
    

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)