[Python-ideas] Quick idea: defining variables from functions that take the variable name
Steven D'Aprano
steve at pearwood.info
Tue May 31 10:04:16 EDT 2016
On Wed, Jun 01, 2016 at 01:02:57AM +1200, Greg Ewing wrote:
> >On 31 May 2016 at 04:08, Steven D'Aprano <steve at pearwood.info> wrote:
> >
> >>T -> TypeVar()
> >>x -> Symbol()
> >>T -> type(bases, ns)
> >>Record -> namedtuple(fields)
>
> The arrow seems back to front. It should point towards
> the name being assigned.
See my response to Stephen, but in a nutshell, no, we can't use <-
because that's already legal for (less than) (unary minus).
Besides, the concepts I'm hinting at with -> are:
(1) "x becomes the value of the right hand side"
(2) "copy the name 'x' over to the right hand side"
> T <- TypeVar()
> x <- Symbol()
> T <- type(bases, ns)
> Record <- namedtuple(fields)
>
> Also, if the RHS is going to be called as part of
> the <- operation, shouldn't the first two just be
>
> T <- TypeVar
> x <- Symbol
No, because in the general case they might require more than
one argument. Besides, I want to make it clear that the right hand side
is being called. And I don't want to make the same mistake as decorator
syntax.
I'm not saying that decorator syntax is bad (it's been really
successful!) but the choice to leave off the parens does make things a
bit more complicated in some cases. E.g. if your decorator wants to take
extra arguments, you have to write a decorator factory:
def factory(args):
process(args)
def decorator(func):
@wraps(func)
def inner(*args, **kwargs):
...
return inner
return decorator
@factory(args)
def spam(): ...
That's not awful, but it does lead to a trap: what if you make the
args optional? Then you can leave them out when calling the factory:
@factory()
def spam(): ...
but in practice that tends to be a bug magnet, because people
invariably forget the parens. And *that* leads to spam being bound to
the decorator itself, which is wrong, but you don't find out until you
actually call spam.
I don't think this suggested syntax will be used as often as decorators,
so I don't think it's worth the risk of complicating matters by making
the parens optional. Keep them explicit and then you never need to worry
about whether they are needed or not, they're always needed.
> The main drawback is that '<-' doesn't suggest in any
> way what's going on.
Well, apart from the languages and pseudo-code that already uses <- as
an assignment operator :-)
> An alternative might be
>
> def x = Symbol
>
> since 'def' has the precedent of attaching the name
> being bound to the object being created.
I never thought of it like that before.
To me, I don't think def is a good match because def doesn't have a left
and right hand side. Assignment does. I know that *technically* def is
an assignment (a name binding) but it doesn't look like one. It looks
like a definition or declaration.
--
Steve
More information about the Python-ideas
mailing list