<div dir="ltr"><div dir="ltr"><div dir="ltr">On Sat, Jan 26, 2019 at 10:43 AM David Mertz <<a href="mailto:mertz@gnosis.cx">mertz@gnosis.cx</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div><div class="gmail_quote"><div dir="ltr">No. It's simpler than that! Functions return a single value, period.<br></div></div></div><div dir="auto"><br></div><div dir="auto">That single value might happen to be a tuple or something else unpackable.</div></div></blockquote><div><br></div><div>d'uh -- I was thinking common use case.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div dir="auto"> This makes it feel like we have multiple return values, but we never actually do. The fact that "tuples are spelled by commas not by parentheses" makes this distinction easy to ignore most of the time.</div></div></blockquote><div><br></div><div>yup. And  unpacking behavior. So I guess the correct way to phrase that is that functions return a single object, and that object may or may not be unpackable.</div><div><br></div><div>Key to this is that unlike function parameters, python isn't doing anything special when returning a value form a function, or when assigning a value to a name:</div><div><br></div><div>* functions return a value</div><div><br></div><div>* assignment applies unpacking when assigning to multiple names.</div><div><br></div><div>These two things are orthogonal in the language.</div><div><br></div><div>The challenge in this case is that when you assign to a single name, there is no unpacking:<br></div><div><br></div><div>x = 3,</div><div><br></div><div>So in this case,  the 1-tuple doesn't get unpacked  --  when you are assigning to a single name, there is no unpacking to be done.</div><div><div><br></div><div>but you can unpack a one-tuple, by assigning to  name with a trailing comma:</div><div><br></div><div>In [62]: x, = (3,)                                                              </div><div><br></div><div>In [63]: x                                                                      </div><div>Out[63]: 3</div></div><div><br></div><div>So the challenge is that to support this new feature, we'd need to changing assignment, so that:</div><div><br></div><div>x = an_object</div><div><br></div><div>would look at an_object, and determine if it was one of these function_return_objects that should have the first value unpacked if assigned to a single name, but unpack the others if assigned to a tuple of names -- and THAT is a pretty big change!</div><div><br></div><div>And it would still create odd behavior if teh function return value were not assigned right away, but stored in some other container:</div><div><br></div><div>a_list = [fun1(), fun2()]</div><div><br></div><div>So really, there is no way to create this functionality without major changes to the language.</div><div><br></div><div>-CHB</div><div><br></div><div><br></div><div>-CHB</div><div><br></div></div>-- <br><div dir="ltr" class="gmail_signature">Christopher Barker, PhD<br><br> Python Language Consulting<br>  - Teaching<br>  - Scientific Software Development<br>  - Desktop GUI and Web Development<br>  - wxPython, numpy, scipy, Cython<br></div></div></div>