2010-04-07 43 views
7

使用python optparse.py,有沒有一種方法可以確定是從命令行還是從默認值設置了特定的選項值。如何知道optparse選項是通過命令行還是默認值

理想我想有一個字典就像違約,但包含的選項實際上是從命令行提供

我知道,你可以用默認每個選項比較值的,但是這不會區分值通過與默認值匹配的命令行傳遞。

謝謝!


編輯

對不起我原來的措辭也不是很清楚。

我有大量從批處理文件調用的腳本。出於審計目的,我想報告所傳遞的選項,以及它們是否從命令行,默認或其他方式傳遞到日誌文件。

使用默認值,您可以判斷某個選項是否與默認值匹配,但仍不會告訴您它是否實際上是從命令行提供的。這可能是相關的:如果從命令行傳遞一個選項並且與默認值一致,那麼如果您更改了代碼中的默認值,腳本仍然會獲得相同的值。

對我來說,有一個相當於默認值的包含實際提供的值會很自然。

爲了使問題具體,在這個例子:

>>> sys.argv = ['myscript.py','-a','xxx'] 
>>> import optparse 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('-a', default = 'xxx') 
>>> parser.add_option('-b', default = 'yyy') 

我怎麼知道該選項的是在命令行通過。是手動解析命令行的唯一方法嗎?

(我知道這是一個相當小的觀點,但我認爲這將是值得一問的情況下,我失去了對optparse smthing)

再次感謝

+2

但是,不是默認點,以防止您不必擔心通過了哪些選項 - 無論它們是否匹配默認值? – 2010-04-07 14:59:27

+0

也許這意味着你需要另一種選擇? – codeape 2010-04-07 15:39:50

+0

請參閱我的編輯,這是關於審計的,所以它確實會影響腳本的調用方式。 – user265454 2010-04-09 11:48:08

回答

3

不知道你的代碼是不可能給更好的答案,但...

  1. 根本不通過默認爲解析器和檢查None值。 None值是optparse庫的默認值,因此您可以檢索自己的默認值並按照常規操作;

  2. 延伸optparse專門化它。

我不知道你的程序,但通常它不是一個好的設計改變行爲,當配置是相同的。

6

,而不是下面的樣板代碼:

opts, args = parser.parse_args() 

如果使用下面的代碼,你將有一個額外的值對象opts_no_defaults與選項是由用戶明確規定:

opts_no_defaults = optparse.Values() 
__, args = parser.parse_args(values=opts_no_defaults) 
opts = Values(parser.get_default_values().__dict__) 
opts._update_careful(opts_no_defaults.__dict__) 

最後,opts應與最初的樣板代碼相同。

print opts_no_defaults.__dict__ 
print opts.__dict__ 
for opt in parser._get_all_options(): 
    if opt.dest: 
     print "Value of %s: %s" % (opt._long_opts[0], getattr(opts, opt.dest)) 
     print "Is %s specified by user? %s" % (opt._long_opts[0], hasattr(opt_no_defaults, opt.dest)) 
+0

真的很好!我正在考慮創建一個定製的'OptionParser.get_default_values()',它返回一個自定義的'Values'來跟蹤該值是否具有默認值。 – haridsv 2017-07-17 12:10:27

1
def is_opt_provided (parser, dest): 
    if any (opt.dest == dest and (opt._long_opts[0] in sys.argv[1:] or opt._short_opts[0] in sys.argv[1:]) for opt in parser._get_all_options()): 
     return True 
    return False  

用法:

parser = OptionsParser() 
parser.add_option('-o', '--opt', dest='opt_var', ...) 

if is_opt_provided(parser, 'opt_var'): 
    print "Option -o or --opt has been provided" 

如果Python的維護者包括建議的功能OptionParser類這將是巨大的。

+0

這是非常不可靠的,因爲即使選項字符串與參數中的某些內容匹配,也會返回false + ve。 – haridsv 2017-07-17 11:49:12

相關問題