|
33 | 33 | "from __future__ import annotations\n", |
34 | 34 | "from fastcore.test import *\n", |
35 | 35 | "from nbdev.showdoc import *\n", |
36 | | - "from fastcore.nb_imports import *" |
| 36 | + "from fastcore.nb_imports import *\n", |
| 37 | + "from inspect import get_annotations" |
37 | 38 | ] |
38 | 39 | }, |
39 | 40 | { |
|
553 | 554 | "outputs": [], |
554 | 555 | "source": [ |
555 | 556 | "#|export\n", |
556 | | - "def get_class(nm, *fld_names, sup=None, doc=None, funcs=None, **flds):\n", |
| 557 | + "def get_class(nm, *fld_names, sup=None, doc=None, funcs=None, anno=None, **flds):\n", |
557 | 558 | " \"Dynamically create a class, optionally inheriting from `sup`, containing `fld_names`\"\n", |
558 | 559 | " attrs = {}\n", |
559 | | - " for f in fld_names: attrs[f] = None\n", |
| 560 | + " if not anno: anno = {}\n", |
| 561 | + " for f in fld_names:\n", |
| 562 | + " attrs[f] = None\n", |
| 563 | + " if f not in anno: anno[f] = typing.Any\n", |
560 | 564 | " for f in listify(funcs): attrs[f.__name__] = f\n", |
561 | 565 | " for k,v in flds.items(): attrs[k] = v\n", |
562 | 566 | " sup = ifnone(sup, ())\n", |
|
566 | 570 | " for i,v in enumerate(args): setattr(self, list(attrs.keys())[i], v)\n", |
567 | 571 | " for k,v in kwargs.items(): setattr(self,k,v)\n", |
568 | 572 | "\n", |
569 | | - " all_flds = [*fld_names,*flds.keys()]\n", |
| 573 | + " attrs['_fields'] = [*fld_names,*flds.keys()]\n", |
570 | 574 | " def _eq(self,b):\n", |
571 | | - " return all([getattr(self,k)==getattr(b,k) for k in all_flds])\n", |
| 575 | + " return all([getattr(self,k)==getattr(b,k) for k in self._fields])\n", |
572 | 576 | "\n", |
573 | | - " if not sup: attrs['__repr__'] = basic_repr(all_flds)\n", |
| 577 | + " if not sup: attrs['__repr__'] = basic_repr(attrs['_fields'])\n", |
574 | 578 | " attrs['__init__'] = _init\n", |
575 | 579 | " attrs['__eq__'] = _eq\n", |
| 580 | + " if anno: attrs['__annotations__'] = anno\n", |
576 | 581 | " res = type(nm, sup, attrs)\n", |
577 | 582 | " if doc is not None: res.__doc__ = doc\n", |
578 | 583 | " return res" |
|
592 | 597 | "\n", |
593 | 598 | "### get_class\n", |
594 | 599 | "\n", |
595 | | - "> get_class (nm, *fld_names, sup=None, doc=None, funcs=None, **flds)\n", |
| 600 | + "> get_class (nm, *fld_names, sup=None, doc=None, funcs=None, anno=None,\n", |
| 601 | + "> **flds)\n", |
596 | 602 | "\n", |
597 | 603 | "*Dynamically create a class, optionally inheriting from `sup`, containing `fld_names`*" |
598 | 604 | ], |
|
603 | 609 | "\n", |
604 | 610 | "### get_class\n", |
605 | 611 | "\n", |
606 | | - "> get_class (nm, *fld_names, sup=None, doc=None, funcs=None, **flds)\n", |
| 612 | + "> get_class (nm, *fld_names, sup=None, doc=None, funcs=None, anno=None,\n", |
| 613 | + "> **flds)\n", |
607 | 614 | "\n", |
608 | 615 | "*Dynamically create a class, optionally inheriting from `sup`, containing `fld_names`*" |
609 | 616 | ] |
|
634 | 641 | } |
635 | 642 | ], |
636 | 643 | "source": [ |
637 | | - "_t = get_class('_t', 'a', b=2)\n", |
| 644 | + "_t = get_class('_t', 'a', b=2, anno={'b':int})\n", |
638 | 645 | "t = _t()\n", |
639 | 646 | "test_eq(t.a, None)\n", |
640 | 647 | "test_eq(t.b, 2)\n", |
|
645 | 652 | "test_eq(t.a, 1)\n", |
646 | 653 | "test_eq(t.b, 3)\n", |
647 | 654 | "test_eq(t, pickle.loads(pickle.dumps(t)))\n", |
| 655 | + "test_eq(get_annotations(_t), {'b':int, 'a':typing.Any})\n", |
648 | 656 | "repr(t)" |
649 | 657 | ] |
650 | 658 | }, |
|
662 | 670 | "outputs": [], |
663 | 671 | "source": [ |
664 | 672 | "#|export\n", |
665 | | - "def mk_class(nm, *fld_names, sup=None, doc=None, funcs=None, mod=None, **flds):\n", |
| 673 | + "def mk_class(nm, *fld_names, sup=None, doc=None, funcs=None, mod=None, anno=None, **flds):\n", |
666 | 674 | " \"Create a class using `get_class` and add to the caller's module\"\n", |
667 | 675 | " if mod is None: mod = sys._getframe(1).f_locals\n", |
668 | | - " res = get_class(nm, *fld_names, sup=sup, doc=doc, funcs=funcs, **flds)\n", |
| 676 | + " res = get_class(nm, *fld_names, sup=sup, doc=doc, funcs=funcs, anno=anno, **flds)\n", |
669 | 677 | " mod[nm] = res" |
670 | 678 | ] |
671 | 679 | }, |
|
0 commit comments