6 ms·
You could read "if x := y()" as "if x gets a truthy value from y()." For what it's worth, "x = y()" is one of the harder things for new programmers to translat
by JackC 7y ago
You could read "if x := y()" as "if x gets a truthy value from y()."
For what it's worth, "x = y()" is one of the harder things for new programmers to translate to English in the first place -- it reads most naturally as "x equals y," but leads to better intuitions as "x gets the value of y". I think that's what makes this clunky to verbalize, rather than the "if truthy" bit.
- chrisseaton 7y agoSo := is 'gets a truthy value from'? That seems to work. > For what it's worth, "x = y()" is one of the harder things for new programmers to translate to English in the first place Right... so why have we added more complexity to something known to be very complicated?
- nerdponx 7y agoHow about "assigns to and returns"?
- baq 7y agowe added new syntax for a code pattern that has inherent complexity which can't be reduced.
- chrisseaton 7y agoIt can be reduced into two simpler lines can’t it, both of which could be understood in isolation.
- baq 7y agounderstanding lines in isolation is precisely besides the point here, because the code pattern has to be understood as a whole.
- chrisseaton 7y agoI don’t see why. ‘Assign x’ and ‘is x truthy’ can be understood separately. Worry about what x is being assigned. Then worry about whether its value is truthy.
- baq 7y agolike I said, the whole pattern is more than two lines. the pattern is actually assign-test-fallback-test-fallback-test-etc. to quote the PEP: reductor = dispatch_table.get(cls) if reductor: rv = reductor(x) else: reductor = getattr(x, "__reduce_ex__", None) if reductor: rv = reductor(4) else: reductor = getattr(x, "__reduce__", None) if reductor: rv = reductor() else: raise Error( "un(deep)copyable object of type %s" % cls) becomes: if reductor := dispatch_table.get(cls): rv = reductor(x) elif reductor := getattr(x, "__reduce_ex__", None): rv = reductor(4) elif reductor := getattr(x, "__reduce__", None): rv = reductor() else: raise Error("un(deep)copyable object of type %s" % cls)
- deleted 7y ago[deleted]
- deleted 7y ago[deleted]
- dragonwriter 7y ago> So := is 'gets a truthy value from'? No, “if <expression>” expands to “if <expression> has a truthy value”. “<var> := <expression>” is itself an expression, which can be best (IMO) read in English as “<var> (which is <expression>)”