我将 argparse 与几个子解析器一起使用。我希望我的程序在 args 中的任何地方都采用详细程度的选项,包括子解析器。
from argparse import ArgumentParser
p = ArgumentParser()
p.add_argument('--verbose', '-v', action='count')
sub = p.add_subparsers()
a = sub.add_parser('a')
print(p.parse_args())
Run Code Online (Sandbox Code Playgroud)
默认情况下,如果用于子解析器,主解析器的选项将抛出错误:
$ python tmp.py -v a
Namespace(verbose=1)
$ python tmp.py a -v
usage: tmp.py [-h] [--verbose] {a} ...
tmp.py: error: unrecognized arguments: -v
Run Code Online (Sandbox Code Playgroud)
我从这个答案中查看了父解析器。
from argparse import ArgumentParser
parent = ArgumentParser(add_help=False)
parent.add_argument('--verbose', '-v', action='count')
main = ArgumentParser(parents=[parent])
sub = main.add_subparsers()
a = sub.add_parser('a', parents=[parent])
print(main.parse_args())
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,没有一个共享标志在主解析器上工作。
$ python tmp2.py a -vvv
Namespace(verbose=3)
$ python tmp2.py -vvv …Run Code Online (Sandbox Code Playgroud) 最近,我在系统中遇到了以下代码stdio.h:
struct _IO_FILE_plus;
extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
Run Code Online (Sandbox Code Playgroud)
我曾经看到过这样的指针,这些指针是这样向前声明的:extern struct _IO_FILE *stdin;,但是拥有裸露的结构似乎很奇怪,因为您无法使用该结构或将其传递给函数。这只是一个禁忌症吗?
在以下函数中,我进行初始化args,在调用中使用它们va_start,然后调用va_end。
该代码对我来说似乎正确,但是clang-tidy发出警告:
tmp2.c:7:11: error: Function 'vsnprintf' is called with an uninitialized va_list argument [clang-analyzer-valist.Uninitialized,-warnings-as-errors]
len = vsnprintf((void*)0, 0, format, args);
#include<stdarg.h>
#include<stdio.h>
int f(char *format, ...) {
int len;
va_list args;
va_start(args, format);
len = vsnprintf((void*)0, 0, format, args);
va_end(args);
return len;
}
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,这只会在我一次清理多个文件时发生,因此clang-tidy tmp2.c不会发出警告,但是clang-tidy tmp2.c tmp2.c会发出警告!
这是我的代码还是clang-tidy的问题?我使用的是LLVM 7.0.0版,但8.0.0也会出现该警告。