Property for dataclass field with default value

Peter Otten __peter__ at web.de
Fri Jun 19 14:06:56 EDT 2020


Ivan Ivanyuk wrote:

> On Thu, 18 Jun 2020 at 11:26, Peter Otten <__peter__ at web.de> wrote:
>>
>> Ivan Ivanyuk wrote:
>>
>> > Hello All,
>> >
>> > I have some trouble using @dataclass together with @property decorator
>> > or property() function.
>> >
>> > From the documentation and PEP is seems that the intended behaviour of
>> > @dataclass is to be the same as normal __init__() that sets instance
>> > variables.
>> >
>> > But it seems that when using @property decorator some parts work
>> > differently when relying on default values. I'm using Pyhton 3.8.3 for
>> > this.
>> >
>> > Using the code:
>> >
>> > from dataclasses import dataclass
>> >
>> > @dataclass
>> > class Container:
>> >     x: int = 30
>> >
>> >     @property
>> >     def x(self) -> int:
>> >         return self._x
>> >
>> >     @x.setter
>> >     def x(self, z: int):
>> >         if z > 1:
>> >             self._x = z
>> >         else:
>> >             raise ValueError

[...]

>> Your class definition is basically
>>
>> class Container:
>>     x = default_value
>>     x = property_x
>>
>> i. e. you use the same name twice. A possible workaround might be to
>> define the property in a subclass. That way you get distinct namespaces
>> for the default value and the property:

[...]

> Didn't think about it in such a way! But now that it was pointed, I
> see no obvious way to resolve this in dataclass decorator given the
> way it's implemented now. And while adding another class looks easy it
> somewhat detracts from the dataclasses' purpose of removing
> boilerplate.
> 
> Does it seems like a good idea to ask for documenting that behaviour
> in dataclasses documentation or it's not popular enough use case?

I don't know. From what I've seen runtime value checking has not even been 
considered even though it is part of attrs which seems to be a source of 
inspiration for dataclasses.

https://www.attrs.org/en/stable/examples.html#validators

If you make a feature request on python-ideas or the bugtracker you may at 
least find out why this part was not copied.



More information about the Python-list mailing list