Skip to main content
https://travis-ci.org/stedmeister/easyargs.svg?branch=master

easyargs

A project designed to make command line argument parsing easy.

There are many ways to create a command line parser in python: argparse, docopt, click. These are all great options, but require quite a lot of configuration and sometimes you just need a function to be called. Enter easyargs. Define the function that you want to be called, decorate it and let easyargs work out the command line. This is probably best shown with an example that takes one required argument and two optional ones:

from __future__ import print_function

import easyargs


@easyargs
def main(name, count=1, greeting='Hello'):
    """A simple greeting program"""
    for i in range(count):
        print('{greeting} {name}!'.format(greeting=greeting, name=name))


if __name__ == '__main__':
    main()

In this example, main is inspected, the arg keywords are turned into positional arguments and the kwarg keywords will be turned into optional arguments. This can be seen if we run the above script with the help flag:

$ python simple.py -h
usage: simple_test.py [-h] [--count COUNT] [--greeting GREETING] name

A simple greeting program

positional arguments:
  name

optional arguments:
  -h, --help           show this help message and exit
  --count COUNT
  --greeting GREETING

A few things worth noting. Firstly, the description is taken from the docstring of the function. Secondly, there is no need to convert count to an integer. Because the default argument is of type int, the value is coerced to an integer:

$ python simple.py World
Hello World

$ python simple.py everybody --count 2 --greeting Hola
Hola everybody!
Hola everybody!

How to define the function

The goal of easyargs is to avoid having complicated configuration parameters, and let the function specify things, however, the following list of rules might be useful:

  • main(arg): arg is a required positional argument

  • main(_arg): arg is an optional positional argument

  • main(arg=int, _arg=int): Setting a default value as a basic type will keep the argument positional, but coerce it to that type only tested with int / float

  • main(arg=list): Setting a default argument as a list will consume multiple arguments from the command line. It doesn’t make sense to supply this more than once.

  • main(arg=value): Creates an optional argument with a default value of value

  • main(arg=3): If the default value is of type int / float. Then if a value is set it will be coerced to the type.

  • main(arg=True): If the default value is of type bool, then arg becomes a flag option.

  • main(a=values): If the argument has a length of 1, then it will create a short argument.

Sub commands

Whilst having a simple function parser is great, sometimes you need to have a sub parser. This can be created by wrapping a number of functions in a class. Let’s demonstrate this with another example by duplicating part of the git command. At the same time we’ll introduce the concept of using the docstring to include the help text for each function parameter.

from __future__ import print_function

import easyargs


@easyargs
class GitClone(object):
    """A git clone"""

    def clone(self, src, _dest):
        """
        Clone a repository
        :param src: The source repository to clone from
        :param _dest: The directory to check the source code to
        """

    def commit(self, a=False, m=None, amend=False):
        """
        Commit a change to the index
        :param a: Add all tracked files to the index
        :param m: Supply the commit message on the command line
        :param amend: Amend the previous commit
        """
        print('Committing {m}'.format(m=m))


if __name__ == '__main__':
    GitClone()

Let’s see what this looks like on the command line:

$ python examples/git_clone.py -h
usage: git_clone.py [-h] {clone,commit} ...

A git clone

positional arguments:
  {clone,commit}  sub-command help
    clone         Clone a repository
    commit        Commit a change to the index

optional arguments:
  -h, --help      show this help message and exit

$ python examples/git_clone.py clone
usage: git_clone.py clone [-h] src [dest]
git_clone.py clone: error: too few arguments

$ python examples/git_clone.py clone -h
usage: git_clone.py clone [-h] src [dest]

positional arguments:
  src         The source repository to clone from
  dest        The directory to check the source code to

optional arguments:
  -h, --help  show this help message and exit

$ python examples/git_clone.py commit -am "Message"
Committing Message

Release files for easyargs 0.9.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for easyargs 0.9.4
File Size Uploaded
easyargs-0.9.4.tar.gz 10.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for easyargs 0.9.4
File Interpreter ABI Platform
easyargs-0.9.4-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 20.3 kB

Release files / easyargs-0.9.4.tar.gz

Download URL easyargs-0.9.4.tar.gz
Size 10.4 kB
Tags Source
SHA-256 checksum
How to use checksums
cc5638e2ca63183c9efb2b60d88c9ed1c1e338d41df45492dad078db4400aeb1
BLAKE2b-256 checksum
How to use checksums
45ceebbce6a97305e2bd5e2bcfdeb79409ed7d43d1a383b85db52c6bbacd9e4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / easyargs-0.9.4-py2.py3-none-any.whl

Download URL easyargs-0.9.4-py2.py3-none-any.whl
Size 9.9 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
791a223ec3fc716ebe463dc34f5a57db3d747a6477fb5a0c7e2e1b2d69df9d7c
BLAKE2b-256 checksum
How to use checksums
b60eebd8e33c112912b8b5729b6e43f1a4197879b5e49ca2c3ba39e6709e0d09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.9.4 This release

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page