On Sun, May 13, 2018 at 10:34 AM, Andre Roberge <andre.robe...@gmail.com> wrote: > Second example: multiple assignments. > > When we have multiple temporary assignments, the situation can be more > complicated. In the following series of examples, I will start in reverse > order compared to above. > > 5) using *where* before the iterations > > real_roots2 = [ (-b/(2*a) + D, -b/(2*a) - D) > where D= sqrt( (b/(2*a))**2 - c/a) > where c = c_values/100 > for c_values in range(1000) > if D >= 0] > > 6) using *given* before the iterations > > real_roots2 = [ (-b/(2*a) + D, -b/(2*a) - D) > given D= sqrt( (b/(2*a))**2 - c/a) > given c = c_values/100 > for c_values in range(1000) > if D >= 0] > > 7) using *given* at the very end > > real_roots2 = [ (-b/(2*a) + D, -b/(2*a) - D) > for c_values in range(1000) > if D >= 0 > given D= sqrt( (b/(2*a))**2 - c/a) > given c = c_values/100]
In what order are multiple assignments performed? I guarantee you that whichever you pick, people will wonder why you didn't pick the other. For instance, you've used the word "given" twice, and they appear to nest; but can you use 'c' in the main body? The 'for' loops all execute left to right. Now you're introducing 'given' statements that execute from right to left. I think. > 8) Using := > > real_roots2 = [ ( -b/(2*a) + (D:= sqrt( (b/(2*a))**2 - > (c:=c_values/100)/a), > -b/(2*a) - D) > for c_values in range(1000) > if D >= 0] > > I find this last version extremely difficult to understand compared with the > others where a keyword is used. Perhaps it is because I do not fully > understand how := should be used... It's used where you want to have an expression that you then capture the value of. > Finally ... if "where" cannot be used, given the very special status of such > temporary assignments, could "where_" (with a trailing underscore) be > considered? I would argue that any word followed by an underscore would be > more readable than a compound symbol such as ":=". Definitely not. There is a strong convention around Python that goes the opposite way: if you want to use a keyword like "class" in your API, you use "class_" to avoid the clash. Creating a keyword that inverts this is going to cause nothing but pain. For the situation you're looking for, 'given' is going to be at least as good. But I am still far from convinced that it's better than ':='. Pushing the expression out-of-line creates confusing order of evaluation, whereas prepending 'NAME :=' to an expression doesn't change when anything's evaluated. ChrisA _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/