I have some code which can preprocess (using a metaclass) or postprocess (using a decorator) a class:
@process class K: pass class K(metaclass=process): pass Both should give the same result, but I have found that the results are slightly different because the dict passed to process as a metaclass is different from the the class dict seen by the decorator. I can demonstrate the difference in Python 3.6 by using this metaclass/decorator: class process(type): def __new__(meta, *args): if len(args) == 1: # decorator usage cls = args[0] d = cls.__dict__ elif len(args) == 3: # metaclass usage name, bases, d = args cls = super().__new__(meta, *args) print(sorted(d.keys())) return cls If I then try it against two identical (apart from their names) classes, I get these results: py> @process ... class K: ... x = 1 ... ['__dict__', '__doc__', '__module__', '__weakref__', 'x'] py> class Q(metaclass=process): ... x = 1 ... ['__module__', '__qualname__', 'x'] Now if I check the newly created Q, I see the same keys K has: py> sorted(Q.__dict__.keys()) ['__dict__', '__doc__', '__module__', '__weakref__', 'x'] Is there any documentation for exactly what keys are added to classes when? -- Steven “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list