我有這些語句冷凝多個:的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 + "\"."
必須有凝結這些語句用更少的代碼來結束的方式。誰能幫我?
我有這些語句冷凝多個:的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 + "\"."
必須有凝結這些語句用更少的代碼來結束的方式。誰能幫我?
試試這個:
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
):這是不是足夠強大,會給你「假陽性」和「假陰性「 - 見評論。
這隻適用於所有參數匹配'「 - [az] 「'模式,如果你打算這樣做,你也可以脫掉短跑。 '如果arg.lstrip(' - ')不在'airos'中:...'。否則,如果'arg'有點像'--awful',你會有一個錯誤的否定。 – kojiro
@kojiro OP只是檢查是否有任何命令開關在'arg'變量中。當然,這不是很可靠,因爲上面的''-a「'和'」--angry「'都是合法的,但它在語義上等同於問題中的代碼。爲了創建一個非常健壯的解析器,應該使用'argparse' –
@kojiro是的,這給出了「false negatives」作爲命令切換解析器。但是,再次強調,這並不是我的意圖,我只是在編寫一個OP代碼的較短版本 - 但是OP的代碼不夠穩健,無法從 –
您可以通過執行其精簡:
if arg not in "-a-i-r-o-s":
print "Error: invalid argument \"{}\".".format(arg)
但我建議使用argparse模塊做這一切爲您服務。
你真的想要測試是否(例如)-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
我想測試'-a'是否在參數中。 – user1676037
@ user1676037「-a」是否必須位於參數字符串的前兩個字符中?如果是這樣的話,解決方案非常簡單。 :) – Shashank
嘗試使用蟒蛇[argparse(HTTP://文檔.python.org/dev/library/argparse.html)模塊。它會讓你的生活更輕鬆(避免這種混亂),你的程序看起來更加專業。 – Serdalis
你能用文字說出你想要測試的東西嗎?我認爲這可能有助於澄清如何重寫這種邏輯。 – tacaswell
這是一個非常奇怪的方式來實現參數處理。例如,如果你想做類似'python script.py -f filename -o hypermode -l item1 item2 item3'等等等等,你現在的代碼格式不適用於這種類型的東西。 – Shashank