Python:在函数中将方法作为参数传递

时间:2011-05-04 09:56:43

标签: python methods arguments

我看过很多帖子,但没有一个真正解决我的问题。使用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不高兴:它想要logIn()函数的两个参数。很公平。如果认为问题是getAccount()方法返回了一个元组,它是一个对象。我当时试过了:

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

但这要么没有区别。

如何将getAccount()中的数据传递给logIn()?当然,如果我不明白,我在编程逻辑中缺少一些基本的东西:)

感谢您的帮助。 本杰明

4 个答案:

答案 0 :(得分:8)

您想使用python argument unpacking

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

函数参数前的*表示后面的元组应该被拆分成它的成分并作为位置参数传递给函数。

当然,您可以手动执行此操作,或者编写一个包含其他人建议的元组的包装器,但对于这种情况,解包更有效和pythonic

答案 1 :(得分:6)

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

答案 2 :(得分:3)

您的方法要求两个参数,而如果您想在方法中隐藏登录执行,您可以轻松传递一个参数,执行它并检索数据:

# 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)

请注意,该方法不带括号,然后在检索数据的登录中执行。

答案 3 :(得分:3)

你的标题有点令人困惑,因为你实际上可以通过一种方法。在Python中,函数是第一类,这意味着你可以将它们作为任何值传递。

但是,您的文字表明您想要做其他事情。

Python确实将多个值作为一个值返回,这是值的元组。

return 1, 2

完全相同
return (1, 2)

但是,如果您需要解压缩这些值,就像在您的情况下一样,有几种方法可以实现此目的。

您可以将它们解压缩为变量:

usn, psw = myObject.getAccount()

或者您可以将它们“扩展”到函数调用中:

myModule.logIn(*myObject.getAccount())

这要求参数的数量与元组的维度相同(2参数函数需要元组(x, y)

如果你想要传递方法,你可以这样做,但你需要小心不要叫它:

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

logIn(myObject.getAccount)