Simple argument parser for documented functions
Project description
argParseFromDoc
A simple python package for creating/updating argparse ArgumentParser(s) given a documented function.
Content
Installation
- Option 1. Cloning this repository:
git clone https://github.com/rsanchezgarc/argParseFromDoc.git
cd argParseFromDoc
pip install .
- Option 2. Installing with pip
pip install git+https://github.com/rsanchezgarc/argParseFromDoc
Supported features
- Argument types:
int
,str
,float
andbool
- (Homogeneous) Lists of any of the previous types (defined as
typing.List[primitive_type]
) - Files (defined as
typing.TextIO
andtyping.BinaryIO
)
- Ignoring/selecting a subset of the arguments of the function
- Use
myarg:typing.Optional[VALID_TYPE]=None
to set it as not required parameter orargs_optional=["myarg"]
- Use
- Creating a new parser or adding new arguments to it. You can use also parser groups
- Several docsctring formats (see docstring_parser )
- Support for methods assuming first argument in definition is
self
Assumptions
- Positional arguments. Functions can have positional arguments, but the parser will treat them as
if they were keyword/optional (always
--argname VALUE
) - If no default value is provided for an argument in the typing hint, argument will be considered as
required (
parser.add_argument(..., required=True)
). The same applies todefault=None
except if the name of the argument is included inargs_optional
or it is declared astyping.Optional
. - E.g
get_parser_from_function(..., args_optional=[name1, name2...])
- Boolean arguments:
- Boolean arguments must be provided with default value.
- If a boolean argument defaults to False (
name:bool=False
), the parser sets the argumentname=True
if--name
flag provided. - If a boolean argument defaults to True (
name:bool=True
), the parser sets the argumentname=False
if--NOT_name
flag provided. Please notice that the name of the argument in the argument parser has been changed fromname
to--NOT_name
to reflect that but the argument is stored using the original name, so no further changes are required
- Multiple arguments can be provided if using
typing.List
. For example:def fun(several_strings: List[str]):
- Setting deafult values for
typing.TextIO
andtyping.BinaryIO
is not advisable, as they should be opened files. If you are only employing the function for the argument parser, you could default it to string values pointing files, but again, this is not encouraged. Instead, if you want to set a default filename, use typestr
. The main purpose oftyping.TextIO
andtyping.BinaryIO
in the parser is to allow pipes. For example:#These two commands are equivalent python count_lines --inputFile /etc/passwd cat /etc/passwd | python count_lines --inputFile -
- Methods, including
__init__
, are supported providingself
is always using in as the first argument in the definition - When defining functions,
*arg
and**kwargs
are ignored for the parser. No other*
or**
argument is supported.
Usage
You only need to document the type and possible default values for the arguments of your functions with typing and the description of each within the docstring. Examples of documented functions are:
def add(a: int, b: int):
'''
@param a: first number
@param b: second number
'''
return a + b
def printYourAge(age: int, name: str = "Unknown"):
'''
@param age: your age
@param name: your name
'''
return a + b
def addList(several_nums: List[int], b: int=1):
'''
@param several_nums: first number
@param b: second number
'''
return [a + b for a in several_nums]
Then, obtaining an ArgumentParser for any of these functions (say add
) is as easy as:
if __name__ == "__main__":
from argParseFromDoc import get_parser_from_function
parser = get_parser_from_function(add)
args = parser.parse_args()
print(add(**vars(args)))
Or you can directly use the AutoArgumentParser classs
if __name__ == "__main__":
from argParseFromDoc import AutoArgumentParser
parser = AutoArgumentParser()
parser.add_args_from_function(add)
If you want to add to a previously instantiated parser the arguements of the function,
you just need to provide the original parser (or group) to the get_parser_from_function
function.
if __name__ == "__main__":
from argParseFromDoc import get_parser_from_function
#standard ArgumentParser
from argparse import ArgumentParser
parser = ArgumentParser(prog="Add_example")
parser.add_argument("--other_type_of_argument", type=str, default="Not provided")
#####################################################
# ### If you prefer a group instead of a whole parser
# group = parser.add_argument_group()
# get_parser_from_function(add, parser=group)
#####################################################
#provide the original parser to get_parser_from_function that will add the new options to the parser
get_parser_from_function(add, parser=parser)
args = parser.parse_args()
print(add(**vars(args)))
Finally, if your function has some arguments that you do not want to include
to the parser, you can use the args_to_ignore
option or if you want to use only a subset,
use the args_to_include
option.
def manyArgsFun(a: int, b: int, c: int = 1, d: int = 2, e: str = "oneStr"):
'''
:param a: a
:param b: b
:param c: c
:param d: d
:param e: e
:return:
'''
print(e)
return sum([a, b, c, d])
if __name__ == "__main__":
from argParseFromDoc import get_parser_from_function
# parser = get_parser_from_function(manyArgsFun, args_to_ignore=["c", "d", "e"])
parser = get_parser_from_function(manyArgsFun, args_to_include=["a", "b"])
args = parser.parse_args()
print(manyArgsFun(**vars(args)))
Some additional examples can be found in examples folder or in tests/test_argParseFromDoc.py
Project details
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 argParseFromDoc-0.0.4.tar.gz
.
File metadata
- Download URL: argParseFromDoc-0.0.4.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d25f5d16321b7be9ad94f81b99813ee7658411b78e135de8009401bd3233d3ca |
|
MD5 | ee188b4ed445f5605aaf42911a7a4b5d |
|
BLAKE2b-256 | 17f583e0d72ff9de7d0a60e38a5172928705e089f7775cae3dc37d7bfc792b3b |
File details
Details for the file argParseFromDoc-0.0.4-py3-none-any.whl
.
File metadata
- Download URL: argParseFromDoc-0.0.4-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 681df9b454938dd09cd6feedad7ec543f2f71398415cccedab5327ef6a3a7c5b |
|
MD5 | 1b01b1f4bb4d7c86663bce832a315e2d |
|
BLAKE2b-256 | e5b7530c53d6946a7e9a8efaa2e77641027e791338461d5ca4b793115b919075 |