From b8ad299bfb7a7c2877653b64d38bdcf0fbabcf91 Mon Sep 17 00:00:00 2001 From: yaroslavpankovych Date: Fri, 14 May 2021 21:08:44 +0300 Subject: [PATCH] add __init__ generation --- README.md | 27 ++++++++++++++++++++++++++- pankoff/magic.py | 27 +++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 pankoff/magic.py diff --git a/README.md b/README.md index 06ba1e2..0ceef91 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,33 @@ class Person: self.age = age self.backpack = backpack self.salary = salary +``` +Also, it is possible to autogenerate `__init__`: +```python +from pankoff.magic import autoinit +@autoinit +class Person: + name = String() + age = Number(min_value=18, max_value=100) + backpack = combine(Type, Sized, types=(list,), min_size=5) + salary = Salary(amount=100, currency="USD") +# pass `verbose=True` to `autocommit` in order to see generated source: +@autoinit(verbose=True) +class Person: + ... +# prints: +""" +def __init__(self, name, age, backpack, salary): + self.name = name + self.age = age + self.backpack = backpack + self.salary = salary +""" +``` +## Now, let's create an instance: +```python person = Person( name="John", age=18, @@ -40,7 +65,7 @@ person = Person( salary="100 USD" ) ``` -## Now, lets try invalid data: +### Lets try invalid data: ```python person = Person( diff --git a/pankoff/magic.py b/pankoff/magic.py new file mode 100644 index 0000000..299380b --- /dev/null +++ b/pankoff/magic.py @@ -0,0 +1,27 @@ +from pankoff.base import BaseValidator + +init_template = "def __init__({arguments}):\n\t{assignments}" + + +def autoinit(klass=None, verbose=False): + def inner(cls): + attrs = ["self"] + assignments = [] + namespace = {} + for attr in vars(cls).values(): + if isinstance(attr, BaseValidator): + attrs.append(attr.attr_name) + assignments.append(f"self.{attr.attr_name} = {attr.attr_name}") + init = init_template.format( + arguments=", ".join(attrs), + assignments="\n\t".join(assignments or ["pass"]) + ) + if verbose: + print(init) + exec(init, namespace) + cls.__init__ = namespace["__init__"] + return cls + + if klass is not None: + return inner(klass) + return inner diff --git a/setup.py b/setup.py index 9fa383d..eb3099c 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from distutils.core import setup -version = "2.0" +version = "3.0" setup( name='pankoff', # How you named your package folder (MyLib) packages=['pankoff'], # Chose the same as "name"