[Python-ideas] Classes inside functions [was Re: Add __parent__ to all classes, functions, and modules]

Guido van Rossum guido at python.org
Mon Oct 6 05:04:25 CEST 2014


On Sun, Oct 5, 2014 at 7:36 PM, Steven D'Aprano <steve at pearwood.info> wrote:

> On Sun, Oct 05, 2014 at 02:43:13PM -0700, Guido van Rossum wrote:
>
> > An alternative that wouldn't even require a metaclass would be to write a
> > helper function that looks the class object up by name after parsing
> > __qualname__. There are some limitations to this, e.g. classes defined
> > inside functions -- but that's already a suspect pattern anyway.
>
> I understand that "suspect pattern" doesn't mean "don't ever do this",
> but I wonder what aspect of defining classes inside a function is
> suspect. I think the suspect part is that each invocation of the
> function creates a new class which (at least in the naive case) has the
> same name, same functionality, and looks identical to the casual
> glance but actually isn't. So given:
>
> def maker():
>     class MyClass: pass
>     return MyClass
>
> x = maker()()
> y = maker()()
>
> assert isinstance(x, type(y))
> assert isinstance(y, type(x))
>
>
> both assertions will fail, which may confuse some people. There's
> probably also implications for pickling as well. Are these the only
> "suspect" parts of defining classes inside functions, or have I missed
> something else?
>

Those (and their variations, e.g. using these in except clauses) are the
main concerns; it also generally bothers me when something "smallish" like
a function contains something "larger" like a class, especially when the
class is substantial. It's another case of "flat is better than nested".

The only non-evil use of this pattern that I can recall is in unit tests --
even when it is possible (as it usually is) to move the class definition to
a spot outside the test method, that doesn't make the test code any
clearer. Such classes are usually very small (e.g. overriding just one or
two methods) and are only used within the unit test. (That latter property
is really the saving grace.)

-- 
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20141005/3fe7f0ee/attachment-0001.html>


More information about the Python-ideas mailing list