世界上最智能的命令行参数解析器
项目描述
Plac:以简单的方式解析命令行
plac
是一个Python包,可以从函数签名生成命令行参数。
plac
在Python 2.6到所有Python 3版本上都有效。
plac
不依赖于Python标准库之外的其他模块。
plac
的功能大部分都实现在一个单独的文件中,该文件可以包含在你的源代码中。
快速入门
plac
可以从函数签名自动生成命令行参数。
import plac
def main(model, iter=100, debug=False):
"""
A script for machine learning
"""
print (model, iter, debug)
if __name__ == '__main__':
# Execute function via plac.call()
plac.call(main)
上面的程序现在可以像这样从命令行接收参数
python example.py -d -i 1000 B
没有参数运行脚本 python example.py
会打印
usage: example.py [-h] [-i 100] [-d] {A,B,C}
example.py: error: the following arguments are required: model
此外,程序还可以生成帮助信息
python example.py -h
产生以下输出
usage: example.py [-h] model [iter] [debug]
A script for machine learning
positional arguments:
model
iter [100]
debug [False]
options:
-h, --help show this help message and exit
当您需要更多控制时,plac
提供了三个装饰器来描述位置、选项和标志类型参数
import plac
# Add decorators to the function
@plac.pos('model', help="model name", choices=['A', 'B', 'C'])
@plac.opt('iter', help="iterations", type=int)
@plac.flg('debug', help="debug mode")
def main(model, iter=100, debug=False):
"""
A script for machine learning
"""
print (model, iter, debug)
if __name__ == '__main__':
# Execute function via plac.call().
plac.call(main)
这将生成以下帮助信息
usage: example.py [-h] [-i 100] [-d] {A,B,C}
A script for machine learning
positional arguments:
{A,B,C} model name
options:
-h, --help show this help message and exit
-i 100, --iter 100 iterations
-d, --debug debug mode
装饰器参考
要使用plac
,您只需要了解以下三个装饰器
@plac.pos
- 用于位置参数model
@plac.opt
- 用于键值选项--iter 100
@plac.flg
- 用于标志--debug
它们具有以下签名
# Positional parameters.
pos(arg, help=None, type=None, choices=None, metavar=None):
# Option parameters.
opt(arg, help=None, type=None, abbrev=None, choices=None, metavar=None):
# Flag parameters.
flg(arg, help=None, abbrev=None):
零依赖项...甚至不是plac :-)
值得注意的是,plac
的主要功能是在单个名为plac_core.py
的Python模块中实现的,如果需要,可以将其包含并随源代码一起分发,从而减少代码中的外部依赖。
将plac_core.py
复制到您的包中,然后按如下方式使用它
from mypackage import plac_core as plac
避免名称冲突
Python语法或您的变量命名可能对可以作为参数使用的单词施加限制。为了绕过这种限制,请将尾随下划线添加到名称中。plac
将从命令行参数名称中删除该下划线
import plac
@plac.flg('list_') # avoid clash with builtin
@plac.flg('yield_') # avoid clash with keyword
@plac.opt('sys_') # avoid clash with a very common name
def main(list_, yield_=False, sys_=100):
print(list_)
print(yield_)
print(sys_)
if __name__ == '__main__':
plac.call(main)
产生以下用法
usage: example13.py [-h] [-l] [-y] [-s 100]
optional arguments:
-h, --help show this help message and exit
-l, --list
-y, --yield [False]
-s 100, --sys 100 [100]
可变参数
plac
可以接受多个位置参数,甚至还可以接受额外的键=值对
import plac
@plac.pos('args', help="words")
@plac.opt('kwds', help="key=value", )
def main(*args, **kwds):
print(args)
print(kwds)
if __name__ == '__main__':
plac.call(main)
用法将是
usage: example15.py [-h] [args ...] [kwds ...]
positional arguments:
args words
kwds key=value
optional arguments:
-h, --help show this help message and exit
当以以下方式运行时
python example15.py A B x=10 y=20
程序将打印
('A', 'B')
{'x': '10', 'y': '20'}
安装
pip install plac
测试
运行
python doc/test_plac.py
您将看到几个明显的错误,但这是对的,因为测试正在检查几个错误条件。重要的是您能获得以下类似的行
执行XX测试OK
代码
作者:Michele Simionato,michele.simionato@gmail.com
维护者:Istvan Albert,istvan.albert@gmail.com
问题
许可证
BSD许可