繁体   English   中英

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

[英]Python: pass method as argument in function

我看过很多帖子,但没有一个真正解决我的问题。 使用 Python,我试图将一个方法作为参数传递给需要两个 arguments 的 function:

# 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 并不高兴:它需要两个arguments 用于 logIn() function。 很公平。 如果认为问题在于 getAccount() 方法返回了一个元组,即一个object。 我当时试过:

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

但这两者都没有任何区别。

那么我如何将数据从 getAccount() 传递到 logIn()? 当然,如果我不明白这一点,我就错过了编程逻辑中的一些基本内容:)

感谢您的帮助。 本杰明

您想使用python 参数解包

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

function 的参数前的*表示应将以下元组拆分为其组成部分并作为位置 arguments 传递给 function。

当然,您可以手动执行此操作,或者按照其他人的建议编写一个采用元组的包装器,但对于这种情况,解包更有效且更符合Python 风格

这个

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

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

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

请注意,该方法是在没有括号的情况下传递的,然后您在登录名中执行它以检索数据。

您的标题有点令人困惑,因为您实际上可以传递一个方法。 在 Python 中,函数首先是 class,这意味着您可以将它们作为任何值传递。

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

Python 真的返回多个值作为一个值,一个值的元组。

return 1, 2

真的和

return (1, 2)

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

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

usn, psw = myObject.getAccount()

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

myModule.logIn(*myObject.getAccount())

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

如果您想传递该方法,您可以这样做,但您需要注意不要调用它:

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

logIn(myObject.getAccount)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM