I've been studying magic methods in Python, and have been wondering if there's a way to outline the specific action of:
a = MyClass(*params).method()
versus:
MyClass(*params).method()
In the sense that, perhaps, I may want to return a list that has been split on the '\n'
character, versus dumping the raw list into the variable a
that keeps the '\n'
intact.
Is there a way to ask Python if its next action is about to return a value to a variable, and change action, if that's the case? I was thinking:
class MyClass(object):def __init__(params):self.end = self.method(*params)def __asgn__(self):return self.method(*params).split('\n')def __str__(self):"""this is the fallback if __asgn__ is not called"""return self.method(*params)
No. You cannot change what happens when you assign to a bare name.
You can change what happens if the assignment target on the left hand side is an attribute or item of an object. You can override a[blah] = ...
with __setitem__
and a.blah = ...
with __setattr__
(although you can only hook into these on a
, not on the object being assigned). But you can't override or in any way influence a = ...
.
Note that having the right-hand side change based on what is "going to happen" would be even stranger, and very bad. That would mean that
someFunc(MyClass().method())
could be different than
a = MyClass().method()
someFunc(a)
In Python names are just labels attached to objects. Objects don't get to know what labels are attached to them, and that's a good thing. You might assign the result a computation to an intermediate variable just to make subsequent lines more readable, and you don't want that assignment to change the result of that computation.