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

Gerald Britton gerald.britton at gmail.com
Mon Jan 23 13:27:03 EST 2017


On Jan 23, 2017 1:12 PM, "Britton, Gerald" <Gerald.Britton at td.com> wrote:

On 23/01/17 02:56 PM, Gerald Britton wrote:

>

>

>* On Jan 23, 2017 11:07 AM, "Soni L." <fakedme+py at gmail.com <https://mail.python.org/mailman/listinfo/python-ideas> *

>* <mailto:fakedme% <fakedme%25>2Bpy at gmail.com <https://mail.python.org/mailman/listinfo/python-ideas>>> wrote:*

>

>

>

>*     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.*

>

>

>* Then long_name isn't immutable. It changes with every line. That can *

>* lead to nasty bugs if you count on its immutability.*

>

>* Easy to see. Just print long_name after each call.*



You're mixing up value immutability with name immutability. The name

isn't immutable, but:


Er...No. I'm not confused at all, unless you define immutability in a new
way.. you said that the "value bound to long_name is immutable." It's not.
Your example below proves it.

An immutable object is one whose state cannot be modified once set. That's
not happening here.  The state of the object bound to long_name, which is a
pointer to an instance of you class, changes with each line.



long_name = mkbuilder()

x = long_name

long_name .= seta("a")

y = long_name

long_name .= setb("b")

z = long_name

print(x)  # a = None, b = None

print(y)  # a = "a", b = None

print(z)  # a = "a", b = "b"

print(x is y)  # False

print(x is z)  # False

print(y is z)  # False

print(long_name is z)  # True



See also:



long_name = 1

x = long_name

long_name += 1

y = long_name

long_name += 1

z = long_name

print(x)  # 1

print(y)  # 2

print(z)  # 3

print(x is y)  # False

print(x is z)  # False

print(y is z)  # False

print(long_name is z)  # True

>

>

>

>>*         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.)*

>

>





If you wish to unsubscribe from receiving commercial electronic messages
from TD Bank Group, please click here <http://www.td.com/tdoptout> or go to
the following web address: www.td.com/tdoptout
Si vous souhaitez vous désabonner des messages électroniques de nature
commerciale envoyés par Groupe Banque TD veuillez cliquer ici
<http://www.td.com/tddesab> ou vous rendre à l'adresse www.td.com/tddesab


NOTICE: Confidential message which may be privileged. Unauthorized
use/disclosure prohibited. If received in error, please go to
www.td.com/legal for instructions.
AVIS : Message confidentiel dont le contenu peut être privilégié.
Utilisation/divulgation interdites sans permission. Si reçu par erreur,
prière d'aller au www.td.com/francais/avis_juridique pour des instructions.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170123/ab701ea6/attachment-0001.html>


More information about the Python-ideas mailing list