检查是否定义了sys.argv

检查一个variables是否传递给脚本的最好方法是:

try: sys.argv[1] except NameError: startingpoint = 'blah' else: startingpoint = sys.argv[1] 

最后, try, except和testing len(sys.argv)之间的区别并不是那么重要。 与argparse相比,他们都有些ha </ argparse

这发生在我身上 – 作为一种低预算的争论:

 arg_names = ['command', 'x', 'y', 'operation', 'option'] args = dict(zip(arg_names, sys.argv)) 

你甚至可以使用它来生成一个默认值为Nonenamedtuple ,全部在四行!

 Arg_list = collections.namedtuple('Arg_list', arg_names) args = Arg_list(*(args.get(arg, None) for arg in arg_names)) 

如果你不熟悉namedtuple ,它只是一个像对象一样的元组,允许你使用tup.attribute语法而不是tup.attribute tup[0]语法来访问它的值。

所以第一行为arg_names每个值创build一个新的arg_names 。 第二行传递args字典中的值,当给定参数名称在字典中没有关联值时,使用get返回默认值。

检查sys.argv的长度:

 if len(sys.argv) > 1: blah = sys.argv[1] else: blah = 'blah' 

有些人更喜欢你所build议的基于exception的方法(例如, try: blah = sys.argv[1]; except IndexError: blah = 'blah'除外),但我不喜欢它,因为它不(例如,当你想接受两个或三个参数),它可以隐藏错误(例如,如果你使用了blah = foo(sys.argv[1]) ,但是foo(...)引发了一个IndexError ,那个IndexError会被忽略)。

我还没有看到列出的另一种方法是提前设置您的哨点值。 这个方法利用了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' 

这是一个普通的Python列表。 你可能会发现这个错误是IndexError,但是你最好只是检查长度。

 if len(sys.argv) >= 2: startingpoint = sys.argv[1] else: startingpoint = 'blah' 

我用这个 – 它永远不会失败:

 startingpoint = 'blah' if sys.argv[1:]: startingpoint = sys.argv[1] 

您可以简单地将argv [1]的值附加到argv,然后检查argv [1]是否与您input的string不相等。示例:

 from sys import argv argv.append('SomeString') if argv[1]!="SomeString": print(argv[1]) 

非常接近发件人试图做的事情。 这是我使用的function:

 def get_arg(index): try: sys.argv[index] except IndexError: return '' else: return sys.argv[index] 

所以用法是这样的:

 if __name__ == "__main__": banner(get_arg(1),get_arg(2)) 

一个解决scheme与地图内置function!

 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": ...