2013-03-18 55 views
6

我目前腳本在Python中,但我想嘗試Ruby的幾個原因。我在上週看過很多示例代碼並閱讀了大量文檔。我所關心的一個問題是Ruby中沒有適當的命令行參數解析庫。 Ruby專家,不要生我的氣 - 也許我不知道。這就是我來這裏的原因。紅寶石optparse限制

在Python中,我習慣於使用​​,這在我看來是完美的(也許是爲了我的需要)。不幸的是,OptionParser不允許靈活性和​​的功能。

我專門找在下面的約束現在:

  1. 我如何相互排斥的選項列表?對於例如一個名爲test的程序非常小的選項列表。

    usage: test [-h] [-a | -b | -c] [-d] [filename] 
    

    我可以編寫一些代碼:

    # implement a ---------------------------------------------- 
    opts.on("-a", "--alpha", 
         "implement alpha") do 
        #... 
    end 
    

    等。但是,我沒有辦法使abc互斥,除非我編碼這些排列並做一些錯誤處理。對於例如

    test -ab #should through an error 
    

    在Python,我可以在一個非常簡單的方法做到這一點:

    # create an command line argument parser object 
    cmd_line_parser = argparse.ArgumentParser() 
    
    # create a mutually exclusive group 
    cmd_line_group = cmd_line_parser.add_mutually_exclusive_group() 
    
    1. 其次,我沒有配對-d的方式與-a除非我專門爲這個置換編寫代碼。瘋了吧。

    2. 我必須自己編寫[OPTION]列表;除非我對所有可能的輸入排列進行黑匣子測試並將它們映射到黑匣子列表,否則我無法知道自己是否錯誤或正確。

    3. 此外,必須使用特殊代碼來處理強制性參數。

有一個簡單的使用紅寶石optparse或其他庫處理這些制約因素?

回答

10

docopt同時具有Python和Ruby實現的庫。用於test程序規格是:

usage: test [-h] [-a | -b | -c] [-d] [<filename>] 

A,B,C選項是相互排斥(-ab產生錯誤),它支持組合的選項:-ad-da

爲了使filename參數爲必填項:

usage: test [-h] [-a | -b | -c] [-d] <filename> 
+0

哇。這是瘋了。史詩。期。 這麼長時間以來我一直在做什麼。太棒了。非常感謝。 – p0lAris 2013-03-19 01:11:57