0

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

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

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

例如:

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

将立即打印帮助对话框。我将如何实现我的代码,以便它不会在为其分配名称后立即调用 PrintHelp() 。

编辑:哦,我刚刚意识到我正在进入一个名为帮助的队列,这是我的错误。

感谢您在 PrintHelp 之后删除 () 的提示。

如果我现在想调用一个需要比 self 参数更多的函数怎么办?

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

我会让元组更大并采用命令行参数吗?

4

3 回答 3

2

如果你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 = obj.PrintHelp

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

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

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

于 2010-09-07T19:49:31.930 回答
1

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

也就是说,在您的示例代码中,您实际上是在调用该函数,而您应该简单地获取它的名称:

help = obj.PrintHelp 
heapq.heappush(help, (0, help)) 
于 2010-09-07T19:52:07.130 回答
0

如果要在 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))

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

于 2010-09-07T20:32:11.853 回答