2010-09-07 84 views
0

我正在寫有一些相互依存選擇一個python命令行程序,我想用戶能夠進入哪個爲了取悅他們的選項。暫停功能的要求後傳遞(功能模式)

目前我使用的getopts的庫來解析命令行選項,不幸的分析它們的順序。我已經把一個布爾型標誌系統放在一起,離開處理某些命令行參數,直到它們所依賴的參數被處理,但是我有一個使用優先級隊列的函數調用的優先級隊列,它將在所有命令之後執行行選項被解析。

我知道,Python可以存儲在變量名的功能,但似乎調用函數在同一時間。

例如:

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

將打印的幫助下立即對話框。我將如何去實現我的代碼,以便在分配名稱後不立即調用PrintHelp()。

編輯: 哦,我才意識到我推到一個隊列所謂的幫助,這是我的錯誤。

感謝上除去PrintHelp()之後的尖端。

如果我想現在調用需要比自參數更多的功能是什麼?

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

我只是使元組變大並採用命令行參數嗎?

+0

感謝您的幫助,刪除()會停止執行該功能。 – Julian 2010-09-07 20:21:51

回答

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會覆蓋內置變量,因此訪問內置變量很困難(雖然不是不可能)。通常,不要覆蓋內置的名稱是一個好主意。

+0

感謝您的幫助。無論如何,我意識到我在heapq push line中犯了一個錯誤。但是,這是說,如果該函數需要參數呢? – Julian 2010-09-07 20:28:08

1

而不是使用getopts的,我會建議使用optparseargparse,如果您使用的是較新的Python版本):很可能,你會得到你所需要的,已經實現了一切。

這就是說,在你的示例代碼,你實際上是調用該函數,而你應該簡單地得到它的名字:如果你想存儲在Python一個完整的函數調用

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

,你可以做到這一點以下兩種方法之一:

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

如果您需要關鍵字參數,請告訴我,我也會編輯以照顧這些人。