检查变量是否为脚本传递的最佳方法是什么:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Run Code Online (Sandbox Code Playgroud)
Dav*_*ver 104
检查长度sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Run Code Online (Sandbox Code Playgroud)
有些人更喜欢你建议的基于异常的方法(例如try: blah = sys.argv[1]; except IndexError: blah = 'blah'),但是我不喜欢它,因为它不能很好地"缩放"(例如,当你想接受两个或三个参数时)并且它可能隐藏错误(例如,如果您使用blah = foo(sys.argv[1]),但foo(...)提出了IndexError,IndexError将被忽略).
sen*_*rle 59
最后,try, except和测试之间的差异len(sys.argv)并不是那么重要.与...相比,他们都有点ha argparse.不安.
这种情况发生在我身上 - 作为一种低预算的argparse:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用它来生成一个namedtuple默认值为None- 全部为四行!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
Run Code Online (Sandbox Code Playgroud)
如果您不熟悉namedtuple,它只是一个像对象一样的元组,允许您使用tup.attribute语法而不是tup[0]语法来访问其值.
因此,第一行创建一个新namedtuple类型,其中包含每个值的值arg_names.第二行传递args字典中的值,get用于在给定的参数名称在字典中没有关联值时返回默认值.
jat*_*ism 18
我还没有看到的另一种方法是提前设置你的标记值.此方法利用了Python的惰性求值,您不必总是提供else语句.例:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
Run Code Online (Sandbox Code Playgroud)
或者如果你要使用语法CRAZY,你可以使用Python的三元运算符:
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Run Code Online (Sandbox Code Playgroud)
这是一个普通的Python列表.您可能会遇到的异常是IndexError,但您最好只检查长度.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
Run Code Online (Sandbox Code Playgroud)
我用它 - 它永远不会失败:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
Run Code Online (Sandbox Code Playgroud)