On 7/07/20 7:44 PM, Kyle Stanley wrote:
    Can you explain why these two (apparently) logical assignment processes
have been designed to realise different result-objects?

The reason is because of the conventions chosen in PEP 3132, which implemented the feature in the first place. It was considered to return a tuple for the consistency w/ *args that you initially expected, but the author offered the following reasoning:

> Make the starred target a tuple instead of a list. This would be consistent with a function's *args, but make further processing of the result harder.

So, it was essentially a practicality > purity situation, where it was considered to be more useful to be able to easily transform the result rather than being consistent with *args. If it resulted in a tuple, it would be immutable; this IMO makes sense for *args, but not necessarily for * unpacking in assignments. The syntax is highly similar, but they are used for rather different purposes. That being said, I can certainly understand how the behavior is surprising at first.

There's a bit more details in the mailing list discussion that started the PEP, see https://mail.python.org/pipermail/python-3000/2007-May/007300.html.


Thank you - I had failed to find that discussion, but it and the explanation above, make perfect sense.


You can color me hobgoblin for expecting ?'consistency'! - and whilst I'm liberally (mis-)quoting: I'm not going to argue with the better minds of the giants, upon whose shoulders I stand...


Continuing on, but instead of considering the handling of argument/parameters to be 'authoritative' (which we were, from the perspective of 'consistency'); perhaps consider the assignment decision as "authoritative" and consider if the calling-behavior should be made consistent:-


One of the features of Python's sub-routines, which I enjoy, is summarised in two ways:

1 the many books on 'programming style' (for other languages) which talk about a function's signature needing to separate 'input-parameters', from 'output-parameters' to enhance readability. - in Python we have parameters (let's say: only for input), neatly separated from 'output' values which don't get-a-mention until the return statement (see also "typing" - although the "return" might be considerably separated from the "->").
Python:1, those others:nil!

2 a perennial-question is: "are Python's function-arguments passed by-reference, passed by-value, or what?" - in Python we pass by assignment and 'the rules' vary according to mutability. (in themselves a frequent 'gotcha' for newcomers, but once understood, make perfect sense and realise powerful opportunities)
Python:2, those others:nil - still!
(IMHO)

A matter of style, which I like to follow [is it TDD's influence? - or does it actually come-from reading about DBC (Design by Contract*)?] is the injunction that one *not* vary the value of a parameter inside a method/function. (useful in 'open-box testing' to check both the API and that input+process agrees with the expected and actual output, but irrelevant for 'closed-box testing') This also has the effect of side-stepping any unintended issues caused by changing the values of mutable parameters!
(although sometimes it's a equally-good idea to do-so!)

Accordingly, binding argument-values to mutable parameters (instead of an immutable tuple) might cause problems/"side-effects", were those parameters' values changed within the function!


Making sense to you?
--
Regards =dn
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to