Skip to content

Commit

Permalink
add __init__ generation
Browse files Browse the repository at this point in the history
  • Loading branch information
ypankovych committed May 14, 2021
1 parent 6c13cbf commit b8ad299
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
27 changes: 26 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,41 @@ 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,
backpack=[1, 2, 3, 4, 5],
salary="100 USD"
)
```
## Now, lets try invalid data:
### Lets try invalid data:
```python

person = Person(
Expand Down
27 changes: 27 additions & 0 deletions pankoff/magic.py
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -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"
Expand Down

0 comments on commit b8ad299

Please sign in to comment.