|
503 | 503 | "name": "stdout", |
504 | 504 | "output_type": "stream", |
505 | 505 | "text": [ |
506 | | - "usage: progname [-h] [--a] [--v] [--b B] [--c {aa,bb,cc}] required\n", |
| 506 | + "usage: progname [-h] [--v] [--b B] [--c {aa,bb,cc}] required a\n", |
507 | 507 | "\n", |
508 | 508 | "my docs\n", |
509 | 509 | "\n", |
510 | 510 | "positional arguments:\n", |
511 | 511 | " required Required param\n", |
| 512 | + " a param 1\n", |
512 | 513 | "\n", |
513 | 514 | "options:\n", |
514 | 515 | " -h, --help show this help message and exit\n", |
515 | | - " --a param 1 (default: False)\n", |
516 | 516 | " --v Print version\n", |
517 | 517 | " --b B param 2 (default: test)\n", |
518 | 518 | " --c {aa,bb,cc} param 3 (default: aa)\n" |
|
570 | 570 | "name": "stdout", |
571 | 571 | "output_type": "stream", |
572 | 572 | "text": [ |
573 | | - "usage: progname [-h] [--a] [--v] [--b B] [--c {aa,bb,cc}] required\n", |
| 573 | + "usage: progname [-h] [--v] [--b B] [--c {aa,bb,cc}] required a\n", |
574 | 574 | "\n", |
575 | 575 | "my docs\n", |
576 | 576 | "\n", |
577 | 577 | "positional arguments:\n", |
578 | 578 | " required Required param\n", |
| 579 | + " a param 1\n", |
579 | 580 | "\n", |
580 | 581 | "options:\n", |
581 | 582 | " -h, --help show this help message and exit\n", |
582 | | - " --a param 1 (default: False)\n", |
583 | 583 | " --v Print version\n", |
584 | 584 | " --b B param 2 (default: test)\n", |
585 | 585 | " --c {aa,bb,cc} param 3 (default: aa)\n" |
|
609 | 609 | "name": "stdout", |
610 | 610 | "output_type": "stream", |
611 | 611 | "text": [ |
612 | | - "usage: progname [-h] [--a] [--b B] [--c {aa,bb,cc}] required\n", |
| 612 | + "usage: progname [-h] [--b B] [--c {aa,bb,cc}] required a\n", |
613 | 613 | "\n", |
614 | 614 | "my docs\n", |
615 | 615 | "\n", |
616 | 616 | "positional arguments:\n", |
617 | 617 | " required Required param\n", |
| 618 | + " a param 1\n", |
618 | 619 | "\n", |
619 | 620 | "options:\n", |
620 | 621 | " -h, --help show this help message and exit\n", |
621 | | - " --a param 1 (default: False)\n", |
622 | 622 | " --b B param 2 (default: test)\n", |
623 | 623 | " --c {aa,bb,cc} param 3 (default: aa)\n" |
624 | 624 | ] |
|
752 | 752 | { |
753 | 753 | "cell_type": "code", |
754 | 754 | "execution_count": null, |
755 | | - "id": "3c1b3a65", |
| 755 | + "id": "42c8e85f", |
756 | 756 | "metadata": {}, |
757 | 757 | "outputs": [], |
758 | 758 | "source": [ |
759 | 759 | "#| export\n", |
| 760 | + "from contextvars import ContextVar\n", |
| 761 | + "from contextlib import contextmanager" |
| 762 | + ] |
| 763 | + }, |
| 764 | + { |
| 765 | + "cell_type": "code", |
| 766 | + "execution_count": null, |
| 767 | + "id": "e4537112", |
| 768 | + "metadata": {}, |
| 769 | + "outputs": [], |
| 770 | + "source": [ |
| 771 | + "#| export\n", |
| 772 | + "@contextmanager\n", |
| 773 | + "def set_ctx(cv, val=True):\n", |
| 774 | + " token = cv.set(val)\n", |
| 775 | + " try: yield\n", |
| 776 | + " finally: cv.reset(token)" |
| 777 | + ] |
| 778 | + }, |
| 779 | + { |
| 780 | + "cell_type": "code", |
| 781 | + "execution_count": null, |
| 782 | + "id": "fc816498", |
| 783 | + "metadata": {}, |
| 784 | + "outputs": [], |
| 785 | + "source": [ |
| 786 | + "#| export\n", |
| 787 | + "_in_call_parse = ContextVar('_in_call_parse', default=False)\n", |
| 788 | + "\n", |
760 | 789 | "def call_parse(func=None, nested=False):\n", |
761 | 790 | " \"Decorator to create a simple CLI from `func` using `anno_parser`\"\n", |
762 | 791 | " if func is None: return partial(call_parse, nested=nested)\n", |
763 | 792 | "\n", |
764 | 793 | " @wraps(func)\n", |
765 | 794 | " def _f(*args, **kwargs):\n", |
766 | | - " mod = inspect.getmodule(inspect.currentframe().f_back)\n", |
767 | | - " if not mod: return func(*args, **kwargs)\n", |
768 | | - " if not SCRIPT_INFO.func and mod.__name__==\"__main__\": SCRIPT_INFO.func = func.__name__\n", |
769 | | - " if len(sys.argv)>1 and sys.argv[1]=='': sys.argv.pop(1)\n", |
770 | | - " p = anno_parser(func)\n", |
771 | | - " if nested: args, sys.argv[1:] = p.parse_known_args()\n", |
772 | | - " else: args = p.parse_args()\n", |
773 | | - " args = args.__dict__\n", |
774 | | - " xtra = otherwise(args.pop('xtra', ''), eq(1), p.prog)\n", |
775 | | - " tfunc = trace(func) if args.pop('pdb', False) else func\n", |
776 | | - " return tfunc(**merge(args, args_from_prog(func, xtra)))\n", |
| 795 | + " if args or kwargs or _in_call_parse.get(): return func(*args, **kwargs)\n", |
| 796 | + " with set_ctx(_in_call_parse):\n", |
| 797 | + " mod = inspect.getmodule(inspect.currentframe().f_back)\n", |
| 798 | + " if not mod: return func(*args, **kwargs)\n", |
| 799 | + " if not SCRIPT_INFO.func and mod.__name__==\"__main__\": SCRIPT_INFO.func = func.__name__\n", |
| 800 | + " if len(sys.argv)>1 and sys.argv[1]=='': sys.argv.pop(1)\n", |
| 801 | + " p = anno_parser(func)\n", |
| 802 | + " if nested: args, sys.argv[1:] = p.parse_known_args()\n", |
| 803 | + " else: args = p.parse_args()\n", |
| 804 | + " args = args.__dict__\n", |
| 805 | + " xtra = otherwise(args.pop('xtra', ''), eq(1), p.prog)\n", |
| 806 | + " tfunc = trace(func) if args.pop('pdb', False) else func\n", |
| 807 | + " return tfunc(**merge(args, args_from_prog(func, xtra)))\n", |
777 | 808 | "\n", |
778 | 809 | " mod = inspect.getmodule(inspect.currentframe().f_back)\n", |
779 | 810 | " if getattr(mod, '__name__', '') ==\"__main__\":\n", |
|
0 commit comments