Only objects of globally defined classes are picklable:
class Global: pass
picklable = Global()
def f(): class Local: pass return Local
Local_here = f() unpicklable = Local_here()
However, instances become picklable if we assign the local class to some globally reachable identifier.
Local_here.__qualname__ = 'Local_here' now_picklable = Local_here()
Why not make it a feature? Let's define module level global identifier, for instance `__local_classes__`. It will be a weak dictionary of class objects. Whenever a local class is created, a weak ref is made and reflected in the new classes' qualname.
def f(): class Local: pass # weak ref is created with some unique id return Local
Local_here = f()
print(Local_here.__qualname__) # '__local_classes__["uniqueidxxx"]' assert Local_here is __local_classes__["uniqueidxxx"]
Likewise for local functions.
This would make many objects picklable, which also positively affects modules that rely on `pickle`, like `multiprocessing`.