Argparse - 一次访问多个参数

时间:2013-09-06 11:49:01

标签: python argparse

我的应用程序使用数据库,因此在添加新元素时(从命令行)我想检查这个元素是否已经在数据库中,我对add_argument的“type”参数做了什么:

def check_uniq(project_name):
    if Project.exists(project_name):
        raise argparse.ArgumentTypeError(
    return project_name

这工作得很好但是为了让最终用户更容易思考我想在我的参数中添加一个--force选项,所以这个变量在添加之前经过测试和删除,在这种情况下请注意提出论点。如何在check_uniq中访问--force选项?

2 个答案:

答案 0 :(得分:2)

测试该选项是否设置在相同的if stamement中:

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获取Namespace返回的parser.parse_args()实例。

不幸的是,在解析所有参数之前无法验证这一点,您不能将此函数用作type参数,因为--force选项可以在任何地方指定命令行,在指定项目名称的选项之后的之前。

如果您需要在命令行上的任何项目之前列出 可以使用自定义action;自定义操作传递给--force对象,目前已解析

namespace

答案 1 :(得分:1)

type函数的目的是将参数字符串转换为其他类型的对象(intfloatfile)。它无权访问解析器的namespace或其他属性。间接地它可以访问全局状态,例如在FileType中尝试打开文件时。

action可以访问namespace,但通常是为了设置值(属性)。它可以检查其他属性的值,但最终会限制属性的设置顺序(例如--force必须在database之前)。

您还可以在namespace之后检查parse_args个属性。您仍然可以通过调用argparse来使用parser.error('your message')错误机制。在此阶段检查值可能更容易,因为您不必担心sys.argv中字符串的顺序。