Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jantic
GitHub Repository: jantic/deoldify
Path: blob/master/fastai/script.py
781 views
1
import os, sys, subprocess, inspect
2
from dataclasses import dataclass
3
from typing import Any
4
from argparse import ArgumentParser
5
6
7
@dataclass
8
class Param():
9
"A parameter in a function used in `anno_parser` or `call_parse`"
10
help:str=None
11
type:type=None
12
opt:bool=True
13
action:str=None
14
nargs:str=None
15
const:str=None
16
choices:str=None
17
required:bool=None
18
19
@property
20
def pre(self): return '--' if self.opt else ''
21
@property
22
def kwargs(self): return {k:v for k,v in self.__dict__.items()
23
if v is not None and k!='opt'}
24
25
def anno_parser(func):
26
"Look at params (annotated with `Param`) in func and return an `ArgumentParser`"
27
p = ArgumentParser(description=func.__doc__)
28
for k,v in inspect.signature(func).parameters.items():
29
param = func.__annotations__.get(k, Param())
30
kwargs = param.kwargs
31
if v.default != inspect.Parameter.empty: kwargs['default'] = v.default
32
p.add_argument(f"{param.pre}{k}", **kwargs)
33
return p
34
35
def call_parse(func):
36
"Decorator to create a simple CLI from `func` using `anno_parser`"
37
name = inspect.currentframe().f_back.f_globals['__name__']
38
if name == "__main__":
39
args = anno_parser(func).parse_args()
40
func(**args.__dict__)
41
else: return func
42
43
def call_plac(f):
44
"Decorator to create a simple CLI from `func` using `plac`"
45
name = inspect.currentframe().f_back.f_globals['__name__']
46
if name == '__main__':
47
import plac
48
res = plac.call(f)
49
if callable(res): res()
50
else: return f
51
52
53