在Python中挂起函数调用以便稍后传递(函数范例)

在Python中挂起函数调用以便稍后传递(函数范例),python,functional-programming,suspend,Python,Functional Programming,Suspend,我正在编写一个python命令行程序,它有一些相互依赖的选项,我希望用户能够按照他们喜欢的顺序输入选项 目前,我正在使用getopts库来解析命令行选项,不幸的是,这会按顺序解析它们。我创建了一个布尔标志系统,将某些命令行参数的处理留到它们所依赖的参数被处理之前,但是我想到了使用函数调用的优先级队列,该队列将在解析所有命令行选项后执行 我知道Python可以用变量名存储函数,但这似乎同时调用了函数 例如: help = obj.PrintHelp() heapq.heappush(command

我正在编写一个python命令行程序,它有一些相互依赖的选项,我希望用户能够按照他们喜欢的顺序输入选项

目前,我正在使用getopts库来解析命令行选项,不幸的是,这会按顺序解析它们。我创建了一个布尔标志系统,将某些命令行参数的处理留到它们所依赖的参数被处理之前,但是我想到了使用函数调用的优先级队列,该队列将在解析所有命令行选项后执行

我知道Python可以用变量名存储函数,但这似乎同时调用了函数

例如:

help = obj.PrintHelp()
heapq.heappush(commandQ, (0, help))
将立即打印“帮助”对话框。我将如何实现我的代码,使其不会在分配名称后立即调用PrintHelp()

编辑: 哦,我刚意识到我在排队叫救命,那是我的错

感谢提供打印帮助后删除()的提示

如果我现在想调用一个需要更多自参数的函数,该怎么办

myFun = obj.parseFile(path)
heapq.heappush(commandQ, (1, myFun))

我是否可以将元组变大并使用命令行参数?

如果您像这样使用heappush:

myFun = obj.parseFile(path)
heapq.heappush(commandQ, (1, myFun))
myFun = obj.parseFile
heapq.heappush(commandQ, (1, myFun, path))
然后,要稍后调用该函数,可以执行以下操作:

while commandQ:
    x=heapq.heappop(commandQ)
    func=x[1]
    args=x[2:]
    func(*args)

使用

没有括号。这使得
help
引用该函数。 稍后,您可以使用
help()
调用该函数

另外请注意(如果我正确理解您的情况),您可以使用标准库中的or(如果您有Python2.7或更高版本)模块以任意顺序处理命令行选项


PS.
help
是Python中的内置函数。命名变量
help
会覆盖内置变量,使访问内置变量变得困难(尽管并非不可能)。一般来说,最好不要覆盖内置程序的名称。

如果您
heappush
如下所示:

myFun = obj.parseFile
heapq.heappush(commandQ, (1, myFun, path))
然后,要稍后调用该函数,可以执行以下操作:

while commandQ:
    x=heapq.heappop(commandQ)
    func=x[1]
    args=x[2:]
    func(*args)

使用

没有括号。这使得
help
引用该函数。 稍后,您可以使用
help()
调用该函数

另外请注意(如果我正确理解您的情况),您可以使用标准库中的or(如果您有Python2.7或更高版本)模块以任意顺序处理命令行选项


PS.
help
是Python中的内置函数。命名变量
help
会覆盖内置变量,使访问内置变量变得困难(尽管并非不可能)。一般来说,最好不要覆盖内置程序的名称。

我建议使用(,如果您使用的是较新的python版本),而不是使用getopts:

也就是说,在您的示例代码中,您实际上是在调用函数,而您只需获取其名称:

help = obj.PrintHelp 
heapq.heappush(help, (0, help)) 

我建议不要使用getopts,而是使用(,如果您使用的是较新的python版本):最有可能的是,您将获得所需的一切,并且已经实现了

也就是说,在您的示例代码中,您实际上是在调用函数,而您只需获取其名称:

help = obj.PrintHelp 
heapq.heappush(help, (0, help)) 

如果要在Python中存储完整的函数调用,可以采用以下两种方法之一:

# option 1: hold the parameters separately
# I've also skipped saving the function in a 'help' variable'
heapq.heappush(commandQ, (0, obj.PrintHelp, param1, param2))

# later:
command = commandQ[0]
heapq.heappop(commandQ)
command[1](*command[2:]) # call the function (second item) with args (remainder of items)
或者,您可以使用助手通过
lambda
打包参数:

# option 2: build a no-argument anonymous function that knows what arguments
#           to give the real one
# module scope
def makeCall(func, *args):
    return lambda: func(*args)

# now you can:
help = makeCall(obj.PrintHelp, param1, param2)
heapq.heappush(commandQ, (0, help))

如果您需要关键字参数,请告诉我,我也会编辑以处理这些参数。

如果您想在Python中存储完整的函数调用,可以采用以下两种方法之一:

# option 1: hold the parameters separately
# I've also skipped saving the function in a 'help' variable'
heapq.heappush(commandQ, (0, obj.PrintHelp, param1, param2))

# later:
command = commandQ[0]
heapq.heappop(commandQ)
command[1](*command[2:]) # call the function (second item) with args (remainder of items)
或者,您可以使用助手通过
lambda
打包参数:

# option 2: build a no-argument anonymous function that knows what arguments
#           to give the real one
# module scope
def makeCall(func, *args):
    return lambda: func(*args)

# now you can:
help = makeCall(obj.PrintHelp, param1, param2)
heapq.heappush(commandQ, (0, help))

如果您需要关键字参数,请告诉我,我也会编辑以处理这些参数。

谢谢您的帮助,删除()会停止函数的执行。谢谢您的帮助,删除()会停止函数的执行。谢谢您的帮助。不管怎样,我意识到我在heapq推线时犯了一个错误。尽管如此,如果函数接受参数呢?谢谢你的帮助。不管怎样,我意识到我在heapq推线时犯了一个错误。但话说回来,如果函数接受参数呢?