On Wed, Aug 05, 2020 at 10:40:02PM +1200, Greg Ewing wrote:
> A considerable number of moons ago, I suggested that
>
> @my_property
> fred = 42
>
> should expand to
>
> fred = my_property("fred", 42)
That require two different rules for decorators:
@decorator over a `class name` or `def name` statement:
- execute the statement
- bind `name = decorator(name)`
@decorator over a binding `target = expression`:
- bind `target = decorator("target", expression)`
So we're adding significant complexity to the concept of "decorator".
> The point being to give the descriptor access to the name of
> the attribute, without having to repeat yourself.
There is a conflict here between DRY and Explicit Is Better Than
Implicit. In the case of function and class decorators, the factor that
tips it over the edge is not the repeating of the name, but that
decorator syntax puts critical information about the object up front,
near the signature, instead of hidden way down the bottom where is can
be missed:
@property
def thing(self):
# fifty lines of code
makes it obvious that `thing` is a property to even the most lazy and
careless reader. If the call to property followed the method declaration
and it's implementation, it would be far away from the signature,
obscuring the fact that `thing` is not just a method but a property.
There is no such advantage for this suggested decorator syntax:
name = my_property('name', *args, **kw)
is at worst a trivial violation of DRY, and it may not even be that[1],
but is completely flexible in how many positional and keyword arguments
it receives. Whereas:
@my_property
name = arg
takes twice as many lines, can only accept a single positional argument,
loses on the "Explicit versus Implicit" question, and saves at best only
a trivial and inconsequential DRY violation.
So unlike the function/class case, where the benefit is both two-fold
and large, the benefit here is only single and tiny, and in my opinion,
outweighed by the disadvantages.
[1] See discussion here:
http://wiki.c2.com/?DontRepeatYourself
in particular "It's okay to have mechanical, textual duplication". In
this case, the single source of truth is the target name:
name = my_property("name", arg)
with the duplication being a single word, mechanically copied into the
same line. A minor annoyance, but not a DRY violation in any meaningful
sense.
--
Steven
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/NPTHWHSHSFLHY47X3FUILHEZIRR2HOJH/
Code of Conduct: http://python.org/psf/codeofconduct/