对于计算机相关,尤其是搞机器学习的同学们,或者任何需要用到Python写实验代码的朋友,在跑Python实验的时候,可以用commandline_config库来提升自己写代码的效率(图片请看下方链接原文):
这是一个可以直接用pip安装的python工具包,适合经常写python代码跑实验的研究生们,工具可以通过Python原生字典dict(支持嵌套)的形式来写实验的参数配置,同时可以通过命令行传参的方式以及代码直接赋值的方式来修改参数值。同时,工具还有配置拷贝,保存到本地或数据库,传参给函数等功能,以及参数完整性检查,参数值类型检查功能以保证代码或命令行参数不会写错,欢迎有需要的朋友使用。
工具可通过pip install commandline_config直接安装使用。
Github 网址
简单示例
# 通过pip安装
pip install commandline_config
# 导包
from commandline_config import Config
# 定义配置字典
config = {
"index":1,
"lr": 0.1,
"dbinfo":{
"username":"NUS"
}
}
# 根据配置生成配置类
c = Config(config)
# 打印参数配置
print(c)
# 代码中通过点.直接读写参数,支持多层:
c.index = 2
c.dbinfo.username = "ZJU"
print(c.index, c.dbinfo.username, c["lr"])
# 在命令行中,通过--修改参数值:
python example.py --index 3 --dbinfo.username XDU
# 代码中通过help方法,或命令行中通过-h或-help来获取参数说明(需要自定义,详情请看下面详细文档)
c.help()
python example.py -h
新特性
v2.2.*
支持字典内参数无限层级嵌套
自动版本检查
支持参数值限定为指定值(枚举)
支持元组类型tuple
支持从本地JSON文件中读取配置
可设置参数帮助,并通过命令行-h打印参数说明
文档更新提供简单示例
请您Star
如果您觉得此工具不错,请轻轻点击github页面右上角Star按钮增加项目曝光度,谢谢!
简单使用示例图
example.py
则在命令行中,可通过--dataset cifar10来给dataset参数赋值为字符串cifar10:
python example.py --dataset cifar10 --lr 0.001 --normalization --multi-information [1,[],[2,[3]]]
原来需要用argparse写的很多行的代码,现在使用此工具之后只需两行即可,并且代码结果更加清晰,易于理解:
配置文件支持嵌套,并可通过.的方式访问和修改属性值:
嵌套配置设置
配置文件支持以直接通过print打印,并以表格或json形式呈现:
开发原因
对于经常跑科研实验的朋友们,大家是不是经常需要在python文件开头设置大量的命令行参数,并在下方代码中以args.*的方式调用:
比如下面的这段示例:
parser = argparse.ArgumentParser(description='index')
parser.add_argument('--index', default=0, type=int, help='party index')
parser.add_argument('--party_num', default=100, type=int)
args = parser.parse_args()
print(args.index)
每多一个参数,代码中就会多一行parser.add_argument,手写每个参数的配置时会很繁琐,如名称需要加--,还有修改默认值,类型以及描述的时候很麻烦,最后也会导致自己的代码很冗长,维护不便。
就算用了更高级一点的Click,也需要不停的写option, 而且有几个option对应函数就要写几个输入参数与之匹配,写代码实在是繁琐,比如以下Click代码:
import click
from caesar_encryption import encrypt
@click.command()
@click.argument('text', nargs=-1)
@click.option('--decrypt/--encrypt', '-d/-e')
@click.option('--key', '-k', default=1)
def caesar(text, decrypt, key):
text_string = ' '.join(text)
if decrypt:
key = -key
cyphertext = encrypt(text_string, key)
click.echo(cyphertext)
if __name__ == '__main__':
caesar()
我并不想在写代码的时候反复指定option选项,并在函数名参数栏写一大堆对应参数,麻烦的很。
因此,如果可以在代码中通过Python对象/JSON的形式写参数配置,会不会就让代码看得更加结构化,更清晰呢?
同时,能不能直接将命令行参数当做Python对象进行读写,深拷贝等操作,就如同没有配置过命令行参数一样?
能不能很方便的将一次实验的配置保存到本地文件或者插入如mongodb这样的数据库中?
另一个问题,能不能保证自己在传递命令行参数或者在python代码中修改键值的时候不会出现如参数名称写错,或者赋值的参数值的类型与初始设置类型不匹配的问题?
最重要的是,能不能让写代码的速度变的很快,而不需要一行一行的添加一点一点的配置呢?
为了解决以上痛点,因此开发了此工具。
我的目标是让大家用更加简单的写出和繁琐的argparse或click这类命令行解析包一样的效果的代码,同时让配置看起来结构化简洁化,选择json格式是因为Python字典类型dict原生就是json格式,所以可以做到和Python代码格式保持一致,从而使我们可以将配置信息直接嵌入到Python代码文件中(任意位置),而不需要建立类似toml这样单独的配置文件,同时,此库也可以在代码文件的任意位置写配置以读取命令行参数以及随时修改配置各字段值的功能等。
简洁命令行配置工具
一个供用户以Python Dict或JSON格式编写(科研中实验)配置的库,同时可以从命令行中读取参数。
文档目录
- [请您Star](#请您star)
- [简洁命令行配置工具](#简洁命令行配置工具)
- [目录](#目录)
- [使用方式](#使用方式)
- [请提出issue](#请提出issue)
- [安装方法](#安装方法)
- [配置方式](#配置方式)
- [配置参数读写方式](#配置参数读写方式)
- [写入方式](#写入方式)
- [读取方式](#读取方式)
- [传递配置给函数](#传递配置给函数)
- [拷贝配置](#拷贝配置)
- [配置参数存储至本地或数据库](#配置参数存储至本地或数据库)
- [注意事项](#注意事项)
- [与Argparse冲突](#与argparse冲突)
- [输入值会自动强制转换为默认值对应类型](#输入值会自动强制转换为默认值对应类型)
- [list参数赋值时字符串元素引号前需加反斜线](#list参数赋值时字符串元素引号前需加反斜线)
- [参数命名规范](#参数命名规范)
- [嵌套对象目前只支持一层](#嵌套对象目前只支持一层)
- [参数完整性检查,所有要修改的参数必须预定义](#参数完整性检查所有要修改的参数必须预定义)
- [ZSH环境特殊配置](#zsh环境特殊配置)
- [完整转换示例](#完整转换示例)
具体安装和使用方式,请参考github中文文档:
CommandlineConfig 中文文档 (github.com)github.com/NaiboWang/CommandlineConfig/blob/master/Readme_CN.md