def A():
def B():
#do something
a = A()
a.B()
Why isn’t the above (such simple code) possible in Python? Is there a ‘pythonic’ (legible, unsurprising, non-hacky) workaround that does not turn A() into a class?
Edit 1: The above was explained to me that B is local to A, thus it only exists as long as A is being evaluated. So if we make it global (and be sure not to have it overriden), then why doesn’t this work?
def A():
def B():
#do something
return A()
a = A()
a.B()
It says it’s returning a ‘NoneType’ object.
Because a function definition just creates a name in the local namespace. What you are doing is no different than:
and then asking why you can’t access
afrom outside the function. Names bound inside a function are local to the function.In addition, your proposed code is strange. when you do
a = f(), you are setting a to the return value of the function. Your function returns nothing, so you can’t hope to access anything through the return value. It is possible to return the inner function directly:And this can indeed be useful. But there isn’t a generic way to access things inside the function from outside except by modifying global variables (which is usually a bad idea) or returning the values. That’s how functions work: they take inputs and return outputs; they don’t make their innards available to the outside word.