【发布时间】:2016-11-26 20:02:18
【问题描述】:
我目前正在为我的库编写一个脚本,但我最终陷入了如何设计 argparse 的困境,该 argparse 将有很多选项和子参数。
目前我正在设计搜索功能,它有以下几个选项,有些是必需的,有些不是:
- search_session_id - 必需
- user_session_id - 必需
- discover_fields - 可选
- start_time - 可选
- end_time - 可选
- summary_fields - 可选
- field_summary - 可选
- local_search - 可选
我的问题如下:
如果所有选项都需要一起工作,但如果只定义其中一个选项,我如何制作 argparse 和 if 语句?
如果我需要检查每一个组合,我会得到这样的结果:
#!/usr/bin/env python3
"""Script to generate searches on the ArcSight Logger"""
import arcsightrest
import argparse
parser = argparse.ArgumentParser(description='Script used to send search '
'queries to ArcSight Logger API')
parser.add_argument('-t', '--target',
help='IP Address of the Loggger', required=True)
parser.add_argument('-u', '--username',
help='Username to access the logger', required=True)
parser.add_argument('-p', '--password',
help='Password to access the logger', required=True)
parser.add_argument('-ussl', '--unsecuressl', action='store_true',
help='Disable ssl warnings', )
parser.add_argument('-w', '--wait', action='store_true',
help='Wait for query to finish', )
parser.add_argument('-q', '--query',
help='Query to be used in the search')
parser.add_argument('-st', '--starttime',
help='From which time the query should look')
parser.add_argument('-et', '--endtime',
help='To which time the query should look')
parser.add_argument('-e', '--event',
help='Events based input search id')
parser.add_argument('-s', '--status',
help='Status of running search')
args = (parser.parse_args())
"""
Sets the target Logger Server
"""
arcsightrest.ArcsightLogger.TARGET = args.target
"""
Gets login token from the Logger API
"""
arc = arcsightrest.ArcsightLogger(args.username, args.password,
args.unsecuressl)
"""
Checks if query is used, and starts a search
"""
if args.query:
if args.starttime:
search_id, response = arc.search(args.query, start_time=args.starttime,
end_time=args.endtime)
search_id, response = arc.search(args.query)
if args.starttime and args.discover_fields:
search_id, response = arc.search(args.query, start_time=args.starttime,
end_time=args.endtime,
discover_fields=args.discover_fields)
print('The search id is {}'.format(search_id))
if response:
print('The search has successfully started')
如您所见,我可以无限继续,创建包含可选参数的每一个组合的 if 语句。必须有一种更简单的方法来设计这个?如果我只是将它解析为 kwargs,它们将不会以正确的格式发送,或者我会要求使用脚本的人编写 end_time=SOMETIME 之类的东西,而不仅仅是 --endtime TIME。现在这似乎是一个很小的代价,但如果我需要将每个函数及其所有参数添加到脚本中,那么这将变得更长更乏味。
【问题讨论】:
标签: python python-3.x argparse