我的应用程序使用数据库,因此在添加新元素时(从命令行)我想检查这个元素是否已经在数据库中,我对add_argument的“type”参数做了什么:
def check_uniq(project_name):
if Project.exists(project_name):
raise argparse.ArgumentTypeError(
return project_name
这工作得很好但是为了让最终用户更容易思考我想在我的参数中添加一个--force
选项,所以这个变量在添加之前经过测试和删除,在这种情况下请注意提出论点。如何在check_uniq中访问--force选项?
答案 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
函数的目的是将参数字符串转换为其他类型的对象(int
,float
,file
)。它无权访问解析器的namespace
或其他属性。间接地它可以访问全局状态,例如在FileType
中尝试打开文件时。
action
可以访问namespace
,但通常是为了设置值(属性)。它可以检查其他属性的值,但最终会限制属性的设置顺序(例如--force
必须在database
之前)。
您还可以在namespace
之后检查parse_args
个属性。您仍然可以通过调用argparse
来使用parser.error('your message')
错误机制。在此阶段检查值可能更容易,因为您不必担心sys.argv
中字符串的顺序。