如何使用 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
,这比检查列表更有效,或者使用 try
和 except
)。
这样的东西
我有两个函数,我想在 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
,这比检查列表更有效,或者使用 try
和 except
)。