[英]Checking if sys.argv[x] is defined
检查是否为脚本传递了变量的最佳方法是什么:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
检查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(...)
引发了一个IndexError
,该IndexError
将被忽略)。
最后, try, except
和 testing len(sys.argv)
之间的区别并不是那么重要。 与argparse
相比,它们都有点hackish。
不过,这发生在我身上——作为一种低预算的 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.attribute
tup[0]
语法访问其值。
因此,第一行创建了一个新的namedtuple
类型,其中包含arg_names
每个值的值。 第二行传递args
字典中的值,当给定的参数名称在字典中没有关联值时,使用get
返回默认值。
我还没有看到列出的另一种方法是提前设置您的哨兵值。 这种方法利用了 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'
我使用这个 - 它永远不会失败:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
这是一个普通的 Python 列表。 您会为此捕获的异常是 IndexError,但您最好只检查长度。
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
非常接近发起者试图做的事情。 这是我使用的一个函数:
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))
使用地图内置功能的解决方案!
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":
...
您可以简单地将 argv[1] 的值附加到 argv,然后检查 argv[1] 是否不等于您输入的字符串示例:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.