<div dir="ltr">If you have to tell such a long and convoluted story to explain a name that you've picked out of the blue and that has no equivalent in other Python data types, it's probably a bad idea. If you're proposing that other mutating methods also gain a flow_XXX variant, please, no! That's like the theory of supersymmetry (SUSY) in particle physics, where ever known particle from the Standard Model would have to have a much heavier "superpartner" just to make some esoteric idea work.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Mar 5, 2019 at 12:54 AM Jonathan Fine <<a href="mailto:jfine2358@gmail.com">jfine2358@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">SUMMARY<br>
Instead of using dict + dict, perhaps use dict.flow_update. Here,<br>
flow_update is just like update, except that it returns self.<br>
<br>
BACKGROUND<br>
There's a difference between a sorted copy of a list, and sorting the<br>
list in place.<br>
<br>
    >>> items = [2, 0, 1, 9]<br>
    >>> sorted(items), items<br>
    ([0, 1, 2, 9], [2, 0, 1, 9])<br>
    >>> items.sort(), items<br>
   (None, [0, 1, 2, 9])<br>
<br>
In Python, mutating methods generally return None. Here, this prevents<br>
beginners thinking their code has produced a sorted copy of a list,<br>
when in fact it has done an in-place sort on the list. If they write<br>
    >>> aaa = my_list.sort()<br>
they'll get a None error when they use aaa.<br>
<br>
The same goes for dict.update. This is a useful feature, particularly<br>
for beginners. It helps them think clearly, and express themselves<br>
clearly.<br>
<br>
THE PROBLEM<br>
This returning None can be a nuisance, sometimes. Suppose we have a<br>
dictionary of default values, and a dictionary of use supplied<br>
options. We wish to combine the two dictionaries, say into a new<br>
combined dictionary.<br>
<br>
One way to do this is:<br>
<br>
   combined = defaults.copy()<br>
   combined.update(options)<br>
<br>
But this is awkward when you're in the middle of calling a function:<br>
<br>
      call_big_method(<br>
          # lots of arguments, one to a line, with comments<br>
          arg = combined, # Look up to see what combined is.<br>
         # more arguments<br>
        )<br>
<br>
USING +<br>
There's a suggestion, that instead one extends Python so that this works:<br>
        arg = defaults + options # What does '+' mean here?<br>
<br>
USING flow_update<br>
Here's another suggestion. Instead write:<br>
        dict_arg = defaults.copy().flow_update(options) # Is this clearer?<br>
<br>
IMPLEMENTATION<br>
Here's an implementation, as a subclass of dict.<br>
<br>
    class mydict(dict):<br>
<br>
        def flow_update(self, *argv, **kwargs):<br>
            self.update(*argv, **kwargs)<br>
            return self<br>
<br>
        def copy(self):<br>
            return self.__class__(self)<br>
<br>
A DIRTY HACK<br>
Not tested, using an assignment expression.<br>
   dict_arg = (tmp := defaults.copy(), tmp.update(options))[0]<br>
Not recommend.<br>
<br>
-- <br>
Jonathan<br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>