[Python-Dev] metaclass insanity
Guido van Rossum
Mon, 04 Nov 2002 20:51:27 -0500
Summary: please, let's not encourage this use of nested classes.
> > Can someone provide a reason why you'd want to use nested classes?
> > I've never felt this need myself. What are the motivations?
> For example, I find it natural to use a nested class to provide an
> iterator object for a class that defines __iter__, in many cases.
Why do you find this natural? Perhaps because you've written a lot of
I find it "not natural" -- I have used this pattern (a helper class)
many times but have never felt the urge to nest the helper inside the
outer class (let alone inside a method of the outer class).
> Of course, I could define that "class Inner" in any place at all,
> but since it's only meant to be used in this one spot, why not
> define it right here? I think it enhances legibility -- if I put it
> elsewhere, the reader of the code seeing just the return statement
> in the def __iter__ must go look elsewhere to see what I'm doing,
> and/or if the reader sees class Inner on its own it may not be
> equally obvious what it's meant to be used for, while with this
> placement it IS abundantly obvious.
It's already been pointed out that placing it inside the __iter__
method is a bad idea because of performance.
I also think that it's better that the iterator class *is* accessible
to the user -- that way you can do an isinstance() check for it, for
The legibility argument is dubious: in a realistic example, the
iterator class may easily be fairly big, and that makes it a
disruptive detail for the reader of the Outer class.
> There are other wrapping/adaptation examples that work similarly,
> where I need a class just inside one particular method or function
> because the only reason for that class's existence is to be suitably
> instantiated to wrap another object and adapt it to some externally
> imposed protocol. I like being able to nest such "local use only"
> wrapper classes in the one and only place where they're needed:
> by being right there they enhance readability as outlined in the
> previous paragraph, in my opinion.
It's still a bad idea.
--Guido van Rossum (home page: http://www.python.org/~guido/)