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

时间:2011-03-24 17:55:37

标签: python

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

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

8 个答案:

答案 0 :(得分:89)

检查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(...)提出IndexErrorIndexError将被忽略)

答案 1 :(得分:53)

最后,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返回默认值。

答案 2 :(得分:15)

我还没有看到的另一种方法是提前设置你的标记值。此方法利用了Python的惰性求值,您不必总是提供else语句。例如:

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

或者如果你要使用语法CRAZY,你可以使用Python的ternary operator

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:1)

使用map内置功能的解决方案!

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

答案 6 :(得分:0)

你可以简单地将argv [1]的值附加到argv,然后检查argv [1]是否不等于你输入的字符串示例:

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

答案 7 :(得分:0)

非常接近发端人试图做的事情。这是我使用的功能:

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))