Python Argparse-一次访问多个参数

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选项,以便在添加之前

我的应用程序使用数据库,因此在添加新元素(从命令行)时,我想检查数据库中是否已经存在该元素,我如何处理add_参数的“type”参数:

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)