-
-
Notifications
You must be signed in to change notification settings - Fork 374
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ability for __post_init__
method to be defined.
#111
Conversation
@@ -680,6 +680,10 @@ def fmt_setter_with_converter(attr_name, value_var): | |||
a.name)) | |||
names_for_globals[val_name] = a.validator | |||
names_for_globals[attr_name] = a | |||
lines.extend([ | |||
"func = getattr(self, '__post_init__', None)", |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
Current coverage is 100% (diff: 100%)@@ master #111 diff @@
====================================
Files 8 8
Lines 466 468 +2
Methods 0 0
Messages 0 0
Branches 105 106 +1
====================================
+ Hits 466 468 +2
Misses 0 0
Partials 0 0
|
script, globs = _attrs_to_script( | ||
attrs, | ||
frozen, | ||
post_init=hasattr(cls, '__post_init__') |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have added a bunch of comments many of which arguably should have been covered by the contribution guide so I’ve added it to my own todo list to fix that.
If you have problems with Hypothesis, offering candy to @Tinche always helped for me. ;)
Thank you for your contribution! And please remember to ping the ticket once you’re done.
@@ -540,7 +544,7 @@ def validate(inst): | |||
a.validator(inst, a, getattr(inst, a.name)) | |||
|
|||
|
|||
def _attrs_to_script(attrs, frozen): | |||
def _attrs_to_script(attrs, frozen, post_init=False): |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
@@ -680,6 +684,8 @@ def fmt_setter_with_converter(attr_name, value_var): | |||
a.name)) | |||
names_for_globals[val_name] = a.validator | |||
names_for_globals[attr_name] = a | |||
if post_init: | |||
lines.append("self.__post_init__()") |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
@@ -302,6 +302,22 @@ class D(object): | |||
assert C.D.__name__ == "D" | |||
assert C.D.__qualname__ == C.__qualname__ + ".D" | |||
|
|||
def test_post_init(self): |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
@@ -551,6 +551,25 @@ You can still have power over the attributes if you pass a dictionary of name: ` | |||
>>> i.y | |||
[] | |||
|
|||
Sometimes, you want to have your class's ``__init__`` method do more than just |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
@@ -13,6 +13,9 @@ Changes: | |||
|
|||
- Don't overwrite ``__name__`` with ``__qualname__`` for ``attr.s(slots=True)`` classes. | |||
`#99 <https://github.com/hynek/attrs/issues/99>`_ | |||
- Allow for a ``__post_init__`` method that, if defined, will get executed at |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
self2.z = self2.x + self2.y | ||
|
||
c = C(x=10, y=20) | ||
assert hasattr(c, 'z') |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
||
c = C(x=10, y=20) | ||
assert hasattr(c, 'z') | ||
assert c.z == 30 |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
If this method is defined for a class, it will get executed at the end of ``__init__``. Previously, there was no way to extend what was done during ``__init__`` when using ``@attr.s``.
Late to the party, but yes absolutely post conversion |
I’ve fixed it up so we don’t have ping-pong over minutiae anymore, thank you very much for your contribution! I’ve decided to rename If someone has good arguments against it, feel free to open a new issue before 16.3.0 is out. |
If this method is defined for a class, it will get executed at the end
of
__init__
. Previously, there was no way to extend what wasdone during
__init__
when using@attr.s
.