如何用ArgParse调用函数传参?调用function_3遇未识别参数错误
问题分析与解决
问题原因
你的代码和调用命令存在三个关键问题:
- 调用命令格式错误:使用子命令解析器时,必须先指定子命令
fc3,再传递参数,而非直接使用--pass。 - 参数命名冲突:
pass是Python关键字,不能用作argparse的参数名,会导致解析异常。 - 函数调用缺少参数:
function_3需要接收一个参数,但你调用options.func()时未传递任何参数。
修复步骤
1. 修改代码中的参数名与函数调用
将参数名改为合法名称(如arg_pass),同时在调用函数时传递解析后的参数:
import argparse import sys def function_1(): print('Function 1') def function_2(): print('Function 2') def function_3(arg): print(f'Function 3 {arg}') if __name__ == "__main__": parser = argparse.ArgumentParser() subparsers = parser.add_subparsers() parser_f1 = subparsers.add_parser('fc1', help='Function 1') parser_f1.set_defaults(func=function_1) parser_f2 = subparsers.add_parser('fc2', help='Function 2') parser_f2.set_defaults(func=function_2) parser_f3 = subparsers.add_parser('fc3', help='Function 3') # 修改参数名为合法名称 parser_f3.add_argument("arg_pass", help="function 3 argument") parser_f3.set_defaults(func=function_3) if len(sys.argv) <= 1: sys.argv.append('--help') options = parser.parse_args() # 根据子命令判断是否传递参数 if options.func == function_3: options.func(options.arg_pass) else: options.func()
2. 使用正确的调用命令
因为arg_pass是位置参数,直接在子命令后跟上参数值即可:
python script.py fc3 test
如果希望将参数改为可选参数(即使用--pass形式),可修改参数定义:
parser_f3.add_argument("--pass", dest="arg_pass", help="function 3 argument")
此时调用命令改为:
python script.py fc3 --pass test
验证结果
修改后运行对应命令,会输出:
Function 3 test
内容的提问来源于stack exchange,提问作者Shinomoto Asakura
相关产品推荐
相关产品推荐

