The smartest command line arguments parser in the world
Project description
Plac: Parsing the Command Line the Easy Way
plac
is a Python package that can generate command line parameters
from function signatures.
plac
works on Python 2.6 through all versions of Python 3.
plac
has no dependencies beyond modules already present in the Python
standard library.
plac
implements most of its functionality in a single file that may be
included in your source code.
Quickstart
Here is how to turn a script that does some processing on a database table into a full, command-line enabled program:
# updatedb.py
from datetime import datetime
def main(dsn, table='product', today=datetime.today()):
"Do something on the database"
print(dsn, table, today)
if __name__ == '__main__':
import plac
plac.call(main)
Here is the help message automatically generated by plac:
python updatedb.py -h
prints:
usage: updatedb.py [-h] dsn [table] [today]
Do something on the database
positional arguments:
dsn
table [product]
today [2019-07-28 07:18:20.054708]
optional arguments:
-h, --help show this help message and exit
Next steps
The automatic inference takes us only so far, usually we need more
control over the parameters. plac
offers simple decorator helpers for
positional, option and flag type parameters:
import plac
from pathlib import Path
@plac.pos('model', "Model name", choices=['A', 'B', 'C'])
@plac.opt('output_dir', "Optional output directory", type=Path)
@plac.opt('n_iter', "Number of training iterations", type=int)
@plac.flg('debug', "Enable debug mode")
def main(model, output_dir='.', n_iter=100, debug=False):
"""A script for machine learning"""
pass
if __name__ == '__main__':
plac.call(main)
Running the script with $ python example.py -h
will give you the
following help message: :
usage: example.py [-h] [-o .] [-n 100] [-d] {A,B,C}
A script for machine learning
positional arguments:
{A,B,C} Model name
optional arguments:
-h, --help show this help message and exit
-o ., --output-dir . Optional output directory
-n 100, --n-iter 100 Number of training iterations
-d, --debug Enable debug mode
Quick reference
The following decorator reference helps you recall what parameters are valid for each decorator type:
# Positional parameters.
def pos(arg, help=None, type=None, choices=None, metavar=None):
# Option parameters.
def opt(arg, help=None, type=None, abbrev=None, choices=None, metavar=None):
# Flag parameters.
def flg(arg, help=None, abbrev=None):
Notably, the main functionality of plac
is implemented in a single
module called plac_core.py
that, if necessary, may be included and
distributed with your source code thus reducing external dependencies in
your code.
Avoiding name clashes
Python syntax, or your variable naming may impose constraints on what
words may be used as parameters. To circumvent that limitation append a
trailing underscore to the name. plac
will strip that underscore from
the command line parameter name:
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)
produces the usage:
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]
Variable arguments
Your plac
enabled program may accept multiple positional arguments and even additional key=value pairs:
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)
the usage will be:
usage: example15.py [-h] [args ...] [kwds ...]
positional arguments:
args words
kwds key=value
optional arguments:
-h, --help show this help message and exit
when running it as:
python example15.py A B x=10 y=20
the program prints:
('A', 'B')
{'x': '10', 'y': '20'}
Documentation
In addition, plac can do a lot more, up to the creation of domain-specific languages(!). See the full documentation for more details.
Installation
If you wish to install the package do
pip install plac
If you prefer to install the full distribution from source, including the documentation, download the tarball, unpack it and run
python setup.py install
Testing
Run
python doc/test_plac.py
You will see several apparent errors, but this is right, since the tests are checking for several error conditions. The important thing is that you get at the a line like
Executed XX tests OK
Code
Author: Michele Simionato, michele.simionato@gmail.com
Maintainer: Istvan Albert, istvan.albert@gmail.com
Issues
License
BSD License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file plac-1.3.4.tar.gz
.
File metadata
- Download URL: plac-1.3.4.tar.gz
- Upload date:
- Size: 37.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c91a4c9f9cc67c7e7213b6823b0ea15cd0afe5eaf8f8dda1fe5cb10192b137f5 |
|
MD5 | e941363e34ebbc98f44b7de85ba0e7a8 |
|
BLAKE2b-256 | 245b28c7d11464a737526a89bf453bb239a5e1f136b7b4785ac111d6b0c85e9d |
File details
Details for the file plac-1.3.4-py2.py3-none-any.whl
.
File metadata
- Download URL: plac-1.3.4-py2.py3-none-any.whl
- Upload date:
- Size: 22.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3eef39de00010f3afe9edf6b19794c29083f3f8da5a677f6cd62a332c9fd138b |
|
MD5 | 4f62665cdbc7bc428f30e4a5d6cdf2ec |
|
BLAKE2b-256 | 7f96216af28f571154178f0deb5cd0c7daba74866f3a5f78f75400c3c6c02d2c |