Initial commit
commit
9b5e4c809e
@ -0,0 +1,2 @@
|
|||||||
|
.pyc
|
||||||
|
__pycache__
|
@ -0,0 +1,40 @@
|
|||||||
|
import argparse
|
||||||
|
from typing import TypeVar, Generic, cast
|
||||||
|
|
||||||
|
Value = TypeVar("Value")
|
||||||
|
|
||||||
|
|
||||||
|
class Arg(Generic[Value]):
|
||||||
|
value: Value
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.args = args
|
||||||
|
self.kwargs = kwargs
|
||||||
|
|
||||||
|
def __set_name__(self, owner, name):
|
||||||
|
owner.arguments.append(name)
|
||||||
|
|
||||||
|
def __get__(self, instance, owner) -> Value:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class TypedNamespace(argparse.Namespace):
|
||||||
|
arguments = []
|
||||||
|
@property
|
||||||
|
def descriptors(self):
|
||||||
|
return [(arg, self.__class__.__dict__[arg]) for arg in self.arguments]
|
||||||
|
|
||||||
|
|
||||||
|
Namespace = TypeVar("Namespace", bound=argparse.Namespace)
|
||||||
|
|
||||||
|
|
||||||
|
class ParseArger(argparse.ArgumentParser, Generic[Namespace]):
|
||||||
|
def __init__(self, *args, namespace: Namespace, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.namespace = namespace
|
||||||
|
if namespace is not None:
|
||||||
|
for name, descriptor in namespace.descriptors:
|
||||||
|
self.add_argument(f"--{name.replace('_', '-')}", *descriptor.args, **descriptor.kwargs)
|
||||||
|
|
||||||
|
def parse_args(self, args=None) -> Namespace:
|
||||||
|
return cast(Namespace, super().parse_args(args=args, namespace=self.namespace))
|
@ -0,0 +1,11 @@
|
|||||||
|
from parsearger import ParseArger, Arg, TypedNamespace
|
||||||
|
|
||||||
|
class CliArgs(TypedNamespace):
|
||||||
|
num_things = Arg[int](help="Some help message", type=int)
|
||||||
|
name_thing = Arg[str](help="Name of some thing")
|
||||||
|
|
||||||
|
namespace = CliArgs()
|
||||||
|
parser = ParseArger(namespace=namespace)
|
||||||
|
args = parser.parse_args()
|
||||||
|
args.num_things
|
||||||
|
args.name_thing
|
@ -0,0 +1,16 @@
|
|||||||
|
from collections import namedtuple
|
||||||
|
import argparse
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--num-things", help="Number of things", type=int)
|
||||||
|
args.num_things
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--some-arg')
|
||||||
|
parser.add_argument('--another-arg')
|
||||||
|
MagicNamespace = namedtuple('MagicNamespace', [act.dest for act in parser._actions])
|
||||||
|
mn = MagicNamespace()
|
||||||
|
mn.some_arg
|
||||||
|
mn.foo
|
||||||
|
parsed = parser.parse_args(['--some-arg', 'val1', '--another-arg', 'val2'], namespace=mn)
|
||||||
|
parsed.some_arg
|
||||||
|
parsed.foo
|
Loading…
Reference in New Issue