我遇到一个字符串比较的奇怪问题似乎源于我使用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
我非常有信心这个问题来自args.server,好像我硬编码服务器名称然后它没有问题。
提前感谢您的任何帮助!
答案 0 :(得分: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()
答案 1 :(得分: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')
argparse
使用的测试相当于args.server in ['serverA','serverB']
。