2013-11-15 38 views
-2

我遇到了一個奇怪的問題,這個字符串比較似乎源於我使用argparse模塊從命令行獲取值。基本上,我們的目標是採取了一些服務器,並從那裏執行一些動作的名稱...Python-比較使用argparse從命令行得到的字符串的問題

./this_script.py -p 3 -s serverA 

相關號碼選項工作得很好,但由於某些原因字符串相關的選項未通過我的錯誤檢查。

相關代碼如下:

parser.add_argument("-s", "--server", help="the server on which to act, either serverA or serverB") 

,然後將錯誤檢查(目前調試

if args.server: 
    print "server given" 
    print args.server 
    if args.server is "serverA": 
      print "server is " + args.server 
    elif args.server is "serverB": 
      print "server is " + args.server 
    else: 
      sys.stderr.write("error, invalid server given\n") 
      sys.exit() 

所以,當我調用腳本,並通過它的服務器參數總是轉到錯誤條件:

~> ./this_script.py -s serverA 
server given 
serverA 
error, invalid server serverA given 

我相當有信心,這個問題來了f rom args.server,就好像我硬編碼的服務器名稱,那麼它的工作沒有問題。

在此先感謝您的幫助!

+0

http://stackoverflow.com/questions/2988017/string-comparison-in-python-is-vs – RyPeck

+0

看看''-s serverA'.split()[ - 1]是'serverA'。如果字符串來自不同的來源,它們可能與'=='匹配,但不能與'is'匹配。 – hpaulj

回答

3

請勿使用is進行平等比較。它測試對象身份,並且您不能保證相等的字符串將使用同一個對象。改爲使用==

嘗試

if args.server: 
    print "server given" 
    print args.server 
    if args.server == "serverA": 
      print "server is " + args.server 
    elif args.server == "serverB": 
      print "server is " + args.server 
    else: 
      sys.stderr.write("error, invalid server given\n") 
      sys.exit() 
0

這看起來像一個情況choices

parser.add_argument('-s','--server',choices=['serverA','serverB']) 

即使沒有自定義幫助線,它提供了這樣的錯誤消息:

usage: ipython [-h] [-s {serverA,serverB}] 
ipython: error: argument -s/--server: invalid choice: 'serverC' (choose from 'serverA', 'serverB') 

即​​採用的是相當於args.server in ['serverA','serverB']測試。