right, c4d.ID_USERDATA .-)
but this works here, I just verified again :
create any object, add some userdata, lets say an integer with id = 1
op[c4d.ID_USERDATA, 1] # 0
op[c4d.ID_USERDATA, 1] = 123 # 123
op.GetData()[c4d.ID_USERDATA] # 123 <-- you need to set the value, first (by gui or code)
op.GetData() is a BaseContainer having a sub-BaseContainer with id=700,
so i suppose this is where the values are stored, after they have been set.
if they have not been set, op[c4d.ID_USERDATA, 1] seems to return the default value from the description.
but its kind of useless, because you need to iterate the description anyway to be sure to get all values
problem there is that if you iterate the description there are also ids for groups, separators (and other stuff?)
which are not (changeable) values, so you have to filter these out.