On 01.06.2016 17:29, Steven D'Aprano wrote:
If you want instead to use a magic local variable somehow injected automatically into the __init__ method at runtime, I think that's very clever. TOO clever, and far too magical.
I consider a special syntax for this narrow kind of usecase way too much as it doesn't seem very flexible and extensible in the future. Dunder methods/attributes/variables allow far more. Especially while pondering over a reply to Michael's post, there's more to consider than just the name of the defining scope. One would need the scope itself. We could add another dunder attribute/method/variable for this as well; or provide a combined dunder access to it.
Automatically providing a function argument is quite easy to understand, since the argument is right there in the method definition, and it is conceptually just like "self". It also means that both of these will work will work exactly the same way:
x = Function('x', args) # explicitly provide the name
x -> Function(args) # use the new syntax
I admit it looks looks neat but to me it's not really worth such restricting syntax as explained above.
But with your magic __assigned_name__ local variable, the signature of the function must change depending on whether it is being called with one argument or two.
I don't think so: class Symbol: def __init__(self, name=None): self.name = name or __assigned_name__
That's just it. I consider __assigned_name__ the same as __module__. A special variable available if you need it. I'm not sure what you mean by __module__.
Sorry, if that was not clear. Here you are:
class X: ... pass ... X.__module__ '__main__'
So, we already have this kind of "let me know what my defining scope looked like" dunder attributes. Best, Sven