
On Wed, Apr 26, 2017 at 11:29:19PM +0100, Erik wrote:
But, if we're going to bikeshed and there is some weight behind the idea that this "papercut" should be addressed, then given my previous comparisons with importing, what about having 'import' as an operator:
def __init__(self, a, b, c): self import a, b self.foo = c * 100
[snarky] If we're going to randomly choose arbitrary keywords with no connection to the operation being performed, can we use `del` instead of `import` because it's three characters less typing? [/snarky] *wink* But seriously, I hate this idea. `import` has certain semantics that don't apply here: - import goes through the full import system (sys.modules, reading files from disk, sys.path, etc.); this "self import ..." does not; - import creates local variables; this "self import ..." does not. The semantics are very different and there's little or no connection between importing a module and setting an attribute on self. If we're going to discuss pie-in-the-sky suggestions, here is an only semi-serious suggestion. A statement that injects identifiers into an explicitly given name space: inject spam, eggs as cackleberry, cheese into self (If you don't like "inject", I'm okay with "load" or even "push".) This would be equivalent to: self.spam = spam self.cackleberry = eggs self.cheese = cheese Presumably it would be implemented a little more efficiently, e.g. only a single lookup for self, etc. Note that the target is completely general: you can inject into any object which will accept setting attributes: inject spam, eggs into namespace If the "inject as" form is used, the value can be any expression: inject x + 1 as y into namespace otherwise the value must be a valid identifier but not necessarily a local variable. If I were designing a language from scratch, one with a maximalist approach to syntax, I'd take this seriously. But Python has relatively minimal syntax and keywords, and the problem this solves isn't big or important enough for the disruption of adding a new keyword. -- Steve