阅读argparse文档

This commit is contained in:
asahi
2024-05-04 23:00:31 +08:00
parent 3f77333e4e
commit 2e90007639

166
python/argparse.md Normal file
View File

@@ -0,0 +1,166 @@
- [argparse](#argparse)
- [位置参数](#位置参数)
- [可选项参数](#可选项参数)
- [store\_true](#store_true)
- [短选项](#短选项)
- [为可选参数指定type](#为可选参数指定type)
- [choice](#choice)
- [count](#count)
- [add\_mutually\_exclusive\_group](#add_mutually_exclusive_group)
- [指定命令行描述](#指定命令行描述)
# argparse
通过argparse模块可以针对命令行参数进行解析。
## 位置参数
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
```
## 可选项参数
### store_true
通过将action指定为`store_true`,当命令行参数中出现该可选参数时,`args.{opt_flag_name}`值为True否则为False
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
```
### 短选项
可以为可选参数指定段选项,令`-v``--verbose`达到相同的效果
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
```
### 为可选参数指定type
为可选参数指定type后可选参数后必须跟随一个整数值。
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
```
### choice
可以通过为可选参数指定`choice`来限定可选参数值范围
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
```
### count
可以将可选参数的action指定为`count`,此时`args.{opt_flag_name}`的值将为该可选参数出现的次数如未指定该可选参数值为None。
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
```
如果想要在未指定可选参数时,为该参数指定一个默认值,可以使用`default`
```py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity >= 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)
```
### add_mutually_exclusive_group
通过`add_mutually_exclusive_group`,可以指定彼此之间相互冲突的选项:
```py
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print(f"{args.x} to the power {args.y} equals {answer}")
else:
print(f"{args.x}^{args.y} == {answer}")
```
此时,`-v``-q`为冲突的可选参数,无法同时指定
## 指定命令行描述
```py
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print(f"{args.x} to the power {args.y} equals {answer}")
else:
print(f"{args.x}^{args.y} == {answer}")
```