检查是否定义了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))
你甚至可以使用它来生成一个默认值为None
的namedtuple
,全部在四行!
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": ...