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

2024-04-26 04:24:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个函数,我想在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

Tags: 函数nameimportformat终端numbermessageif
2条回答

你肯定问错了问题。您的问题是“参数如何在Python上工作”,对于使用参数,我知道有两个选项:

  • 使用系统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,例如带有标志和特定的值类型,那么应该使用^{}^{}之类的内容。你知道吗

相关问题 更多 >