视频链接:
不如语冰
https://space.bilibili.com/70431433?spm_id_from=333.1007.0.0
文章代码链接:
https://github.com/zyf-ngu/Qmatter
参数的传递
代码在运行时,需要传入不同的参数。对于简单程序来说,参数可以直接写在文件里,但是这样修改维护不方便,Python动态维护参数的常用方法有2类,一类是处理命令行的args类,另一个就是把参数写在config配置文件里作为模块导入到需使用的文件。
argparse
argparse用来解析命令行参数和选项
分为三个步骤
1创建参数解析器 :是参数解析系统的"配置器",负责定义参数规则,在下面的添加参数后基本不变,ArgumentParser 类实例
parser=argparse.ArgumentParser()
2解析器添加参数:
parser.add_argument("num1",type,required,default)
parser.add_argument("num2",type,required,default)
3输出解析结果:是参数解析系统的"输出",包含解析后的实际值,每次运行根据命令行输入变化,Namespace 类实例
args=parser.parse_args()
三个步骤形成了一个完整的工作流:定义规则 → 解析输入 → 使用结果
注意这里解析参数得到的args是一个对象,而前面获取的参数就是它的属性,因此在代码中使用参数就是获取对象的属性,方法为对象名.参数名,即 args.num1 ,args.num2
或者使用vars()将解析值转换成字典对象。
我们重点关注分析一下第二步的添加参数到底是在做什么?首先要明确,解析器要添加读取的是命令行上的内容,这些内容就是参数的值,而add_argument()括号里的内容就是在指定参数的名称,参数值的数据类型,数量,帮助信息等。
参数的类型有2种,位置参数(参考函数的位置参数)和选项标志,
添加位置参数(必需参数 )
位置参数(类似于函数的位置参数):在add_argument()`中只提供参数名称(不包含前缀`-`或`--`)。例如:`parser.add_argument("filename")`。
parser.add_argument(
"filename", # 参数名称
type=str, # 参数转换函数
nargs="+", # 接受一个或多个值
help="输入文件路径" # 帮助信息)
添加位置参数时需要注意什么?
- 顺序性:位置参数在命令行中出现的顺序必须与程序中定义的顺序一致。
2.必需性:默认情况下,位置参数是必需的。如果用户没有提供,argparse会报错。如果希望位置参数可选,可以通过设置nargs参数(例如nargs='?')来实现。如果设置了`nargs='?'`,则可以为位置参数设置默认值。
运行时在命令行输入 python example.py test.docx,这个test.docx就是参数filename的值。
添加可选参数
parser.add_argument(
"-v", "--verbose", # 短选项和长选项
action="store_true", # 参数行为
dest="show_details", # 结果对象中的属性名
help="显示详细输出" # 帮助信息)
可选参数:在add_argument()中提供了以-或--开头的选项标志。
(1)-v和--verbose是用来定义同一个命令行选项的两种形式。它们的主要区别在于:-v 是短选项(一个短横线加一个字母),便于快速输入;而 --verbose是长选项(两个短横线加一个单词或词组)。长选项含义更清晰,更易阅读和理解。 在同一个add_argument方法中,它们指向同一个目标(即同一个属性)。一般使用长选项去掉前面的两个短横线后的名字(即verbose)作为属性名
在命令行上,用户可以使用以下任意一种形式: python main.py -v 或 python main.py --verbose 。无特殊设置的话,命令行上出现了可选参数,则其对应的参数的值设为true,否则,设为false。
如果只定义了一个选项(例如只定义-v或只定义--verbose),那么用户就只能使用定义的那个选项。
另外,短选项可以合并使用,例如如果有多个短选项,可以合并在一起写:
组合多个短选项 (当多个选项都不需要额外参数时)
python script.py -avs # 等同于 -a -v -s
参数辅助信息
1.help帮助信息:在所有添加的参数后面可以使用help来描述参数的作用。运行程序时只需添加 -h 或 --help 参数即可,其它参数均不需要。
2.type:参数类型转换函数,指将命令行输入的字符串(默认所有参数值都是字符串)转换为程序所需的特定数据类型(如整数、浮点数、布尔值、文件对象等)的过程。当基础类型不能满足需求时,可以创建自定义转换函数,然后令type=自定义函数名。
3.metavar:在帮助文档中显示的参数名称。
4.dest="show_details":可以使用dest参数显式指定属性名(赋别名)。
5.required:标记可选参数是否必需,true为必需。一般用在可选参数,因为位置参数默认是必需的。
6 数量可变的参数:使用nargs参数可以指定参数的数量,传入的参数将被放到参数名称的列表里。
-
nargs=?:0个或1个参数。
-
nargs=*:0个或多个参数。
-
nargs=+:1个或多个参数。
-
整数:确切个数的参数(如nargs=2表示需要两个参数)。
7.action:"store"和"store_true",两者效果完全相同,都会将添加参数的值设置为True。如果未指定,则存储一个False值(或者如果设置了`default`则存储默认值)。
|-------------------|-------------------|---------------|
| action 类型 | 功能描述 | 常用参数 |
| "store" | 存储参数值(默认,可省略) | type, default |
| "store_const" | 存储常量值 | const |
| "store_true" | 存储 True | - |
| "store_false" | 存储 False | - |
| "append" | 将值追加到列表 | - |
| "append_const" | 将常量追加到列表 | const |
| "count" | 计算参数出现次数 | - |
| "help" | 显示帮助信息 | - |
| "version" | 显示版本信息 | version |
| "extend" | 扩展列表(Python 3.8+) | nargs |
- choices:参数允许的值范围,如1, 2, 3, range(1, 10)
- default:参数默认值(当未提供时使用)
添加互斥参数
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--fast",
action="store_true",
help="快速模式(牺牲准确性)")
group.add_argument(
"--accurate",
action="store_true",
help="精确模式(速度较慢)")
获取参数 , 创建一个空 parser 对象,模拟读取命令行参数(实际读取 kawrgs 的参数)
配置文件
在大型项目中,为了更好地维护和管理参数,通常会把关键的参数放置在配置文件里,常用的配置文件一般包括.py文件和.json文件,在开源项目里会有.example文件指导用户给定初始的参数(为了避免在版本控制中暴露敏感信息(如数据库密码、API 密钥等),我们通常不会直接修改 config.py.example 文件,而是将其复制为 config.py,并在这个新文件中修改参数的值。
值得注意的是,若configs是个库,下面有多个配置文件,需要在库下面添加一个 init.py文件,文件里导入各个配置文件,然后在应用文件里再直接导入库 import configs。配置文件参数的优先级低于命令行参数,即命令行传递的参数是最终使用的参数。
.py文件
直接使用 Python 语法 :通过变量、字典或类定义配置。
灵活性强:支持动态逻辑(如条件判断、计算表达式)。
无需解析器 :直接通过 import 导入配置,完全按照Python数据结构的正常方法使用。
潜在安全隐患:如果配置文件来自不可信来源,执行代码可能带来风险。
示例代码
#字典
DATABASE = {
"host": "localhost",
"port": 3306,
"username": "admin",
"password": "secret",
"timeout": 10}
#变量,一般全大写
DEBUG = True # 可动态控制配置项
#使用方式
from config import DATABASE, DEBUG
print(DATABASE"host") # 输出: localhost
print(DEBUG) # 输出: True
可以看到,.py文件将配置参数以字典,变量等数据形式存储,使用时直接import导入对应变量,然后就可以按照Python语法正常使用。
.json 配置文件
结构化数据格式:键值对存储,支持嵌套结构。
跨语言兼容:几乎所有编程语言都能解析。
无代码执行:纯数据文件,安全性高。
严格语法:不允许注释(原生 JSON),需注意格式正确性。
示例文件
{"database": {
"host": "localhost",
"port": 3306,
"username": "admin",
"password": "secret"},
"debug": true}
使用方式
import json
with open("config.json") as f:
config = json.load(f)
print(config"database""host") # 输出: localhost
print(config"debug") # 输出: True