Python Argparse-一次访问多个参数
我的应用程序使用数据库,因此在添加新元素(从命令行)时,我想检查数据库中是否已经存在该元素,我如何处理add_参数的“type”参数:Python Argparse-一次访问多个参数,python,argparse,Python,Argparse,我的应用程序使用数据库,因此在添加新元素(从命令行)时,我想检查数据库中是否已经存在该元素,我如何处理add_参数的“type”参数: def check_uniq(project_name): if Project.exists(project_name): raise argparse.ArgumentTypeError( return project_name 这很好,但是为了让最终用户更容易思考,我想在我的参数中添加一个--force选项,以便在添加之前
def check_uniq(project_name):
if Project.exists(project_name):
raise argparse.ArgumentTypeError(
return project_name
这很好,但是为了让最终用户更容易思考,我想在我的参数中添加一个
--force
选项,以便在添加之前测试并删除此变量,在这种情况下,请注意提出参数。如何在check\u uniq中访问--force选项?如果选项设置在相同的语句中,则测试:
def check_uniq(project_name, options):
if Project.exists(project_name) and not options.force:
raise argparse.ArgumentTypeError('Project already exists')
return project_name
其中,options
获取由parser.parse_args()
返回的命名空间
实例
不幸的是,在解析所有参数之前,您无法验证这一点。您不能将此函数用作类型
参数,因为可以在命令行的任何位置指定--force
选项,该选项位于指定项目名称的选项之前或之后
如果您要求在命令行上的任何项目之前列出--force
,则可以使用自定义命令;自定义操作被传递到名称空间
对象,该对象已解析为:
type
函数的作用是将参数字符串转换为其他类型的对象(int
,float
,file
)。它无权访问命名空间
或解析器的其他属性。它可以间接访问全局状态,例如在FileType
中尝试打开文件时
操作
可以访问名称空间
,尽管这通常是为了设置值(属性)。它可以检查其他属性的值,但最终会限制属性设置的顺序(例如,--force
必须在数据库之前)
您还可以在parse_args
之后检查namespace
属性。您仍然可以通过调用parser.error(“您的消息”)
来使用argparse
错误机制。在这个阶段检查值可能更容易,因为您不必担心sys.argv
中字符串的顺序,解析后的参数是否可以作为全局变量使用?您还可以将命名空间
对象传递到函数中。。
class UniqueProjectAction(argparse.Action):
def __call__(self, parser, namespace, value, option_string=None):
if Project.exists(value) and not namespace.force:
raise argparse.ArgumentTypeError('Project already exists')
setattr(namespace, self.dest, values)