如何使用 sys 而不是 argparse 在终端上选择两个以上的 python 函数?

How do I choose over two python functions on terminal using sys and not argparse?

我有两个函数,我想在 UNIX 终端上选择函数 message() 或函数 number()

这个例子我定义函数里面会用到if __name__ == "__main__"::

import sys

def message(m=sys.argv[2]):
    print(" {} ".format(m))


if __name__ == "__main__":
    message()

在终端正在输入:

$python test.py python!

输出:

python!

然后当我有两个函数并只调用其中一个时:

import sys

def message(m=sys.argv[1]):
    print(" {} ".format(m))

def number(n=sys.argv[1]):
    print(" {} ".format(n+2))

if __name__ == "__main__":
    #code that should be here

你肯定问错了问题。您的问题是 "how do arguments work on Python",对于处理参数,我知道您有两个选择:

  • 使用sys.argv:你需要写类似if "message" in sys.argv
  • 的东西
  • 使用 argparse 这是一个更好的解决方案

执行此操作的规范(并且在我看来是正确的)方法是创建参数值到函数的映射,它易于实现、高效且易于扩展:

import sys

def message(m):
    print(" {} ".format(m))

def number(n):
    print(" {} ".format(int(n) + 2))  # you can't add integers to strings...

FUNCTIONS = {
    'message': message, 
    'number': number
}

if __name__ == "__main__":
    FUNCTIONS[sys.argv[1]](*sys.argv[2:])

请注意使用 * 将其余参数传递给函数 - 请参阅 What does ** (double star) and * (star) do for parameters?。这消除了 sys.argv 具有第三个值来创建函数的要求,如果您决定在其他地方重用这些函数,这可能会成为一个问题。

如果用户输入无效的函数名称,这将引发 KeyError;你可以处理这个问题,如果你愿意,可以给他们一个更具体的错误消息(使用 sys.argv[1] in FUNCTIONS,这比检查列表更有效,或者使用 tryexcept)。

如果您想要更复杂的 CLI,例如标志和特定的值类型,你应该使用像 argparse or click.

这样的东西