Answers:
最后,try, except测试与测试之间的差异len(sys.argv)并不是很大。与argparse。相比,他们都有点笨拙。
不过,这对我来说是一种低成本的argparse:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
您甚至可以使用它生成namedtuple默认值为None-的四行内容的!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
如果您不熟悉namedtuple,它只是一个像对象一样的元组,允许您使用tup.attribute语法而不是tup[0]语法访问其值。
因此,第一行将namedtuple为中的每个值创建一个新类型arg_names。第二行传递args字典中的get值,当给定的参数名称在字典中没有关联的值时,用于返回默认值。
检查的长度sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
有些人喜欢您建议的基于异常的方法(例如try: blah = sys.argv[1]; except IndexError: blah = 'blah'),但我不太喜欢它,因为它不能很好地“扩展”(例如,当您要接受两个或三个参数时)并可能隐藏错误(例如,如果您使用blah = foo(sys.argv[1]),但foo(...)引发IndexError,IndexError将被忽略)。
try, except。只需等待foo您的论点,直到该else条款。
argparse。
argparse.py所有命令行项目。
try子句中……因此,鉴于这并不难(而且,IMO稍微更漂亮),我宁愿只检查长度(而且,避免有人大喊大叫您使用异常进行流量控制。
try必须承认,我有点道歉。我只是觉得有时候比if声明更能表达我的意图。
我尚未看到的另一种方式是提前设置您的哨兵值。该方法利用了Python的惰性评估,在这种评估中,您不必总是提供一条else语句。例:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
或者,如果您要使用CRAZY语法,则可以使用Python的三元运算符:
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
我用它-它永远不会失败:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpoint从示例中删除变量,但是问题是分配了一个后备变量,所以我也做了相同的事情。
sys.argv[1:]:。这适用于位置参数,而count不适用。
使用地图内置功能的解决方案!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
然后,您只需要像这样调用参数即可:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
您可以简单地将argv [1]的值附加到argv,然后检查argv [1]是否不等于您输入的字符串。示例:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])