检查是否定义了sys.argv [x]

Cma*_*mag 84 python

检查变量是否为脚本传递的最佳方法是什么:

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将被忽略).

  • 此外,一旦你考虑扩展,就该转到`argparse`了. (3认同)
  • @senderle:当然,如果您很努力的话,那很好。但是根据我的经验,大多数程序员并不勤奋,而是将所有逻辑放在`try`子句中...因此,鉴于这并不难(而且IMO更漂亮),我宁愿只检查长度(也可以避免有人因为使用例外进行流量控制而大喊大叫。 (2认同)
  • @David,是的,我明白你的意思。我必须承认,我是个“尝试”辩护律师。我只是觉得它有时比`if`语句更清楚地表达我的意图。 (2认同)

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用于在给定的参数名称在字典中没有关联值时返回默认值.

  • 爱它!很容易就是我见过这个问题的最佳解决方案.对于其他人:我(newb)并不是很明显:1)'命令'每次都会作为第一个参数传递,2)你可以用args [0]等调用结果. (2认同)

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 2.4 绑定在一起,而 Python 2.4 却没有它。 (2认同)

Ric*_*ell 9

这是一个普通的Python列表.您可能会遇到的异常是IndexError,但您最好只检查长度.

if len(sys.argv) >= 2:
  startingpoint = sys.argv[1]
else:
  startingpoint = 'blah'
Run Code Online (Sandbox Code Playgroud)


ana*_*nik 8

我用它 - 它永远不会失败:

startingpoint = 'blah'
if sys.argv[1:]:
   startingpoint = sys.argv[1]
Run Code Online (Sandbox Code Playgroud)

  • 为什么索引 `[1:]` 有效而 `[1]` 失败? (3认同)