将不同的输入解析为不同的 Python 函数

如何解决将不同的输入解析为不同的 Python 函数

我有一个名为 functions.py 的文件,其中包含多个函数(func1、func2、func3..) 我想编写一个解析器,允许我以这种方式在终端/集群上运行这些函数

python parser.py -function func1 -inputf1_1 10 inputf1_2 20

我也可以

python parser.py -function func2 -inputf2 'abc'

我知道如何使用不同的解析器文件(parser_func1.py、parser_func2.py)执行此操作,但我更希望只有一个 parser.py 文件

目前我的代码是这样的:

import argparse


def func1(x,y):
    print (x*y)

def func2(text):
    print (text)

ap = argparse.ArgumentParser()


FUNCTION_MAP = {'func1' : func1,'func2' : func2}


# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('command',choices=FUNCTION_MAP.keys(),help='choose function to run')
subparsers = parser.add_subparsers(help='sub-command help')

# create the parser for the "a" command
parser_a = subparsers.add_parser('func1',help='func1 help')
parser_a.add_argument("-x","--x",required=True,help="number 1")
parser_a.add_argument("-y","--y",help="number 2")


# create the parser for the "b" command
parser_b = subparsers.add_parser('func2',help='func2 help')
parser_b.add_argument("-text","--text",help="text you want to print")


args = parser.parse_args()

func = FUNCTION_MAP[args.command]
#I don't kNow how to put the correct inputs inside the func()
func()

当我现在跑步时:

python functions.py func1 -x 10 -y 2

我收到此错误用法:PROG [-h] {func1,func2} {func1,func2} ... PROG:错误:无效选择:'2'(从'func1'、'func2'中选择)

我已经阅读了这些,但仍然不知道如何去做:

https://docs.python.org/3/library/argparse.html#module-argparse

Call function based on argparse

How to use argparse subparsers correctly?

谢谢!

解决方法

add_subparsers 会自动为您添加位置参数,您无需显式添加 func 参数。

但是,您确实需要跟踪使用了哪个子解析器。 docs 很好地解释了这一点。

在知道使用了哪个解析器以及要传递哪些参数后,您可以使用从 args 构造的关键字参数调用特定函数

完整代码如下:

import argparse


def func1(x,y):
    print (x*y)

def func2(text):
    print (text)

ap = argparse.ArgumentParser()


FUNCTION_MAP = {'func1' : func1,'func2' : func2}


# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG')
# Just add the subparser,no need to add any other argument.
# Pass the "dest" argument so that we can figure out which parser was used.
subparsers = parser.add_subparsers(help='sub-command help',dest='subparser_name')

# create the parser for the "a" command
parser_a = subparsers.add_parser('func1',help='func1 help')
# Keep the names here in sync with the argument names for "func1"
# also make sure the expected type is the same (int in this case)
parser_a.add_argument("-x","--x",required=True,help="number 1",type=int)
parser_a.add_argument("-y","--y",help="number 2",type=int)


# create the parser for the "b" command
parser_b = subparsers.add_parser('func2',help='func2 help')
parser_b.add_argument("-text","--text",help="text you want to print")


args = parser.parse_args()

# subparser_name has either "func1" or "func2".
func = FUNCTION_MAP[args.subparser_name]
# the passed arguments can be taken into a dict like this
func_args = vars(args)
# remove "subparser_name" - it's not a valid argument
del func_args['subparser_name']
# now call the function with it's arguments
func(**func_args)

现在,如果我这样调用脚本:

PROG func1 -x 1 -y 3

我得到了结果:

3

如果我这样称呼它:

PROG func2 --text=hello

我明白了:

hello

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?