检查脚本是否传递了变量的最佳方法是什么:
try: sys.argv[1] except NameError: startingpoint = 'blah' else: startingpoint = sys.argv[1]
检查 sys.argv的长度:
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: blah = sys.argv[1]; except IndexError: blah = 'blah'
blah = foo(sys.argv[1])
foo(...)
IndexError
这是一个普通的 Python 列表。您可能会捕捉到的异常是 IndexError,但是您最好只检查长度。
if len(sys.argv) >= 2: startingpoint = sys.argv[1] else: startingpoint = 'blah'
另一种我还没有看到列出的方式是提前设置您的哨兵值。这个方法利用了 Python 的延迟计算,在这种情况下,您不必总是提供 else语句。例如:
else
startingpoint = 'blah' if len(sys.argv) >= 2: startingpoint = sys.argv[1]
或者,如果你想使用疯狂的语法,你可以使用 Python 的 三元运算符三元运算符:
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
最后,try, except和测试 len(sys.argv)之间的差异并不那么显著。和 argparse相比,它们都有点黑客。
try, except
len(sys.argv)
argparse
不过,我突然想到了这一点——作为一种低预算的废话:
arg_names = ['command', 'x', 'y', 'operation', 'option'] args = dict(zip(arg_names, sys.argv))
您甚至可以使用它来生成一个 namedtuple,其值默认为 None——全部用四行代码表示!
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]语法访问它的值。
tup.attribute
tup[0]
因此,第一行创建一个新的 namedtuple类型,其中包含 arg_names中每个值的值。第二行传递来自 args字典的值,当给定参数名在字典中没有关联值时,使用 get返回默认值。
arg_names
args
get
我用这个,从来不会失败:
startingpoint = 'blah' if sys.argv[1:]: startingpoint = sys.argv[1]
您可以简单地将 argv [1]的值附加到 argv,然后检查 argv [1]是否等于您输入的字符串示例:
from sys import argv argv.append('SomeString') if argv[1]!="SomeString": print(argv[1])
非常接近于发起者想要做的事情,下面是我使用的一个函数:
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": ...