polidoro-py-argument

Package to create command line arguments for Python.


License
Unlicense
Install
pip install polidoro-py-argument==2.1.0

Documentation

Polidoro Argument

Tests Upload Python Package Lint with comments GitHub last commit Coverage Status Quality Gate Status

Latest GitHub Release Date

PyPI - Downloads

GitHub

Package to simplify creating command line arguments for scripts in Python.

How to use:

  • Decorate the method you want to create an argument from with @Argument.
  • Decorate the method you want to call from command line with @Command.
  • Create a PolidoroArgumentParser
  • Call parser.parse_args()

All keywords arguments to @Argument and @Command are the same as in argparse.ArgumentParser.add_argument except for 'action' and 'nargs'. 'action' is a custom Action created to run the decorated method and 'nargs' is the number of parameters in the decorated method.

Examples:

foo.py

from polidoro_argument import Argument, PolidoroArgumentParser

@Argument
def bar():
    print('hi')

PolidoroArgumentParser().parse_args()
# OR
parser = PolidoroArgumentParser()
parser.parse_args()

Result:

$ python foo.py --bar
hi 

You can pass argument to the method

from polidoro_argument import Argument

@Argument
def bar(baz=None):
    print(baz)
$ python foo.py --bar Hello
Hello

To create commands

from polidoro_argument import Command


@Command
def command():
    print('this is a command')
$ python foo.py command
this is a command

With arguments

from polidoro_argument import Command


@Command
def command_with_arg(arg, arg1=None):
    print('this the command arg: %s, arg1: %s' % (arg, arg1))
$ python foo.py command_with_arg Hello
this the command arg: Hello, arg1: None
$ python foo.py command_with_arg Hello --arg1 World
this the command arg: Hello, arg1: World

Using a Class

from polidoro_argument import Argument, Command

class ClassCommand:
    @staticmethod
    @Argument
    def argument_in_class():
        print('argument_in_class called')

    @staticmethod
    @Command
    def command_in_class(arg='Oi'):
        print('command_in_class called. arg=%s' % arg)
$ python foo.py classcommand --argument_in_class
argument_in_class called
$ python foo.py classcommand command_in_class
command_in_class called. arg=Oi
$ python foo.py classcommand command_in_class --arg=Ola
command_in_class called. arg=Ola

Undefined number of arguments

from polidoro_argument import Argument


@Argument
def argument(*args, **kwargs):
    print(args, kwargs)


@Argument
def command(*args, **kwargs):
    print(args, kwargs)
$ python foo.py --argument arg1 arg2 kwarg1=1 kwarg2 2 # without '--' in kwargs
('arg1', 'arg2') {'kwarg1': 1, 'kwarg2: 2'}
$ python foo.py command arg1 arg2 --kwarg1=1 --kwarg2 2 # with '--' in kwargs
('arg1', 'arg2') {'kwarg1': 1, 'kwarg2: 2'} 
 

Default Command

It's possible to define a default command to be called when no argument is passed to a command or there is some unrecognized arguments

from polidoro_argument import Command


class Bar(object):
    help = 'cli help'
    description = 'description'

    @staticmethod
    @Command
    def default_command(*remainder):
        if remainder:
            print('with remainders:', *remainder)
        else:
            print('without remainders')
$ python foo.py bar
without remainders
$ python foo.py bar r1 r2 r3
with remainders: r1 r2 r3