[Python-ideas] "Immutable Builder" Pattern and Operator

Soni L. fakedme+py at gmail.com
Mon Jan 23 11:07:50 EST 2017



On 23/01/17 01:52 PM, Gerald Britton wrote:
>
>
>
>     [snip]
>
>     >I propose `x .= y` -> `x = x . y`, for any `y`.
>
>     [snip]
>
>     I think you mean "any y that is a member of x"
>

Since it desugars into `x = x.y`, you can literally use anything for `y`.

x .= __call__().whatever().unwrap() * 3

is equivalent to

x = x.__call__().whatever().unwrap() * 3

and

x .= 1

is equivalent to

x = x.1

which is equivalent to

SyntaxError: invalid syntax

>     Also, note that this syntax means that x will be rebound to the
>     result of calling x.y, whatever that is (frequently, None, for
>     mutating methods)
>
>     In general, you can't count on methods to return references to
>     their instances, even though it's handy for fluent coding, so this
>     side effect may be unexpected to some
>

This is why it's for use with **immutable** objects.

>     That's a problem with your original example:
>
>     >long_name = mkbuilder()
>
>     >long_name = long_name.seta(a)
>
>     >long_name = long_name.setb(b)
>
>     >y = long_name.build()
>
>     What do the methods seta and setb return?  If they don't return
>     "self" you've got a problem. I think.
>

They don't return self. Ever. The value bound to long_name is immutable, 
like an integer. They return a new instance.

>     FWIW why can't you just write:
>
>     x.y
>
>     or for your example:
>
>     long_name.seta(a)
>
>     ?
>
>

See the IRC bot builder example, it should be more clear. (It's about 
forking the builder.)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170123/a311abee/attachment.html>


More information about the Python-ideas mailing list