2013-09-25 30 views
0

我有這些語句冷凝多個:的Python:如果條件

for arg in sys.argv[1:]: 
    if not "-a" in arg and not "-i" in arg and not "-r" in arg and not "-o" in arg and not "-s" in arg: 
     print "Error: invalid argument \"" + arg + "\"." 

必須有凝結這些語句用更少的代碼來結束的方式。誰能幫我?

+4

嘗試使用蟒蛇[argparse(HTTP://文檔.python.org/dev/library/argparse.html)模塊。它會讓你的生活更輕鬆(避免這種混亂),你的程序看起來更加專業。 – Serdalis

+0

你能用文字說出你想要測試的東西嗎?我認爲這可能有助於澄清如何重寫這種邏輯。 – tacaswell

+0

這是一個非常奇怪的方式來實現參數處理。例如,如果你想做類似'python script.py -f filename -o hypermode -l item1 item2 item3'等等等等,你現在的代碼格式不適用於這種類型的東西。 – Shashank

回答

3

試試這個:

valid = {"-a", "-i", "-r", "-o", "-s"} # using a set, for efficiency 
for arg in sys.argv[1:]:     # loop over args 
    if not any(v in arg for v in valid): # equivalent to code in question 
     print 'Error: invalid argument "{}".'.format(arg) # using format string 

不過說真的,你應該考慮使用一個專門的解析器的命令行參數(如argparse):這是不是足夠強大,會給你「假陽性」和「假陰性「 - 見評論。

+0

這隻適用於所有參數匹配'「 - [az] 「'模式,如果你打算這樣做,你也可以脫掉短跑。 '如果arg.lstrip(' - ')不在'airos'中:...'。否則,如果'arg'有點像'--awful',你會有一個錯誤的否定。 – kojiro

+1

@kojiro OP只是檢查是否有任何命令開關在'arg'變量中。當然,這不是很可靠,因爲上面的''-a「'和'」--angry「'都是合法的,但它在語義上等同於問題中的代碼。爲了創建一個非常健壯的解析器,應該使用'argparse' –

+1

@kojiro是的,這給出了「false negatives」作爲命令切換解析器。但是,再次強調,這並不是我的意圖,我只是在編寫一個OP代碼的較短版本 - 但是OP的代碼不夠穩健,無法從 –

1

您可以通過執行其精簡:

if arg not in "-a-i-r-o-s": 
    print "Error: invalid argument \"{}\".".format(arg) 

但我建議使用argparse模塊做這一切爲您服務。

0

你真的想要測試是否(例如)-a的說法,還是-a的說法?後者會更普遍。你可以做這樣的事情:

if arg.startswith("-") and arg[1:2] not in "airos": 
    print "Error: invalid argument '%s'" % arg[:2] 

如果你真的想測試-a是否在爭論,最簡單的方法可能是:

if not any("-" + c in arg for c in "airos"): 
    print "Error: invalid argument '%s'" % arg 
+0

我想測試'-a'是否在參數中。 – user1676037

+0

@ user1676037「-a」是否必須位於參數字符串的前兩個字符中?如果是這樣的話,解決方案非常簡單。 :) – Shashank