I am currently trying to implement a self-written Dataclass wrapper/decorator in python. I have massive trouble passing the arguments and attributes of the function which i want to use that Decorator on.
My thoughtprocess until now: The decorator doesnt know how many attributes and argument the class has, but i somehow still have to access them. I then would have to access those via the "attribute" names. Since the dataclass decorator mainly does what the init does(and optionally eq and so on), i would have to pass the classes/instances dict to access all args. I have already tried to find it myself in Pythons Language reference in the Data Model, but i couldnt find it.
I would appreciate any kind of help, be it where i find the answer in the docs, some kind of tip or a little code snippet.
The dataclass
decorator does essentially two steps while creating a default __init__
instance method for a class:
It extracts all class variables using __annotations__
(See PEP 526) attribute of the class, as is documented in the docstring of dataclass.
It creates a string
containing the entire function definition, with a full parameter list, generated from the class variables of step 1 and if present their default values. It then uses exec
to actually run that as python code, which in turn generates a new user-defined function object
. That new object is finally assigned to the __init__
attribute of the decorated class object
.
So to modify the parameter list of the newly created __init__
function to match the class variables, dataclass
creates a new function definition. There seems to be no direct way of modifying the parameter list of a function object outside the function definition itself.