Python: передать метод в качестве аргумента в функцию - PullRequest
5 голосов
/ 04 мая 2011

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

# this is a method within myObject
def getAccount(self):
    account = (self.__username, self.__password)
    return account
# this is a function from a self-made, imported myModule
def logIn(username,password):
    # log into account
    return someData
# run the function from within the myObject instance
myData = myModule.logIn(myObject.getAccount())

Но тогда Python не рад: он хочет два аргумента для входа в систему () функция.Справедливо.Если подумать, проблема была в том, что метод getAccount () возвратил кортеж, который является one объектом.Тогда я попытался:

def getAccount(self):
    return self.__username, self.__password

Но это тоже не имело значения.

Как тогда я могу передать данные из getAccount () в logIn ()?Конечно, если я этого не понимаю, мне не хватает чего-то фундаментального в логике программирования:)

Спасибо за помощь.Benjamin

Ответы [ 4 ]

8 голосов
/ 04 мая 2011

Вы хотите использовать распаковка аргумента Python :

myData = myModule.logIn( * myObject.getAccount() )

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

Конечно, вы можете сделать это вручную или написать обертку, которая принимает кортеж, как это предлагают другие, но распаковка более эффективна и pythonic для этогослучай.

6 голосов
/ 04 мая 2011

Это

myData = myModule.logIn( * myObject.getAccount() )
3 голосов
/ 04 мая 2011

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

Тем не менее, ваш текст показывает, что вы хотите сделать что-то еще.

Python действительно возвращает несколько значений как одно значение, кортеж значений.

return 1, 2

действительно так же, как

return (1, 2)

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

Вы можете распаковать их в переменные:

usn, psw = myObject.getAccount()

Или вы можете «развернуть» их прямо в вызов функции:

myModule.logIn(*myObject.getAccount())

Для этого необходимо, чтобы количество аргументов было таким же, как и размер кортежа (для функции с двумя аргументами требуется кортеж (x, y))

Если вместо этого вы хотите передать метод, вы можете это сделать, но вам нужно быть осторожным, чтобы не вызывать его:

def logIn(self, a):
   usn, psw = a()
   # do stuff

logIn(myObject.getAccount)
3 голосов
/ 04 мая 2011

Ваш метод запрашивает два параметра, а если вы хотите скрыть выполнение входа в метод, вы можете легко передать один параметр, выполнить его и получить данные:

# this is a method within myObject
def getAccount(self):
    account = (self.__username, self.__password)
    return account

# this is a function from a self-made, imported myModule
def logIn(account):
    user , passwd = account()
   # log into account
   return someData

# run the function from within the myObject instance
myData = myModule.logIn(myObject.getAccount)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...