danielgtaylor / python-betterproto

Clean, modern, Python 3.6+ code generator & library for Protobuf 3 and async gRPC
MIT License
1.56k stars 218 forks source link

Return actual enum's from to_dict #316

Open tcamise-gpsw opened 2 years ago

tcamise-gpsw commented 2 years ago

Perhaps I don't understand the intended use of the to_dict method but, at least for my use case, I would prefer it to return the actual enum instead of it's name as a string.

For example:

class EnumResultGeneric(betterproto.Enum):
    RESULT_UNKNOWN = 0
    RESULT_SUCCESS = 1

@dataclass
class ResponseGeneric(betterproto.Message):
    result: "EnumResultGeneric" = betterproto.enum_field(1)

status = ResponseGeneric.FromString(bytes(bytearray([0x08, 0x01]))).to_dict()['result']
print(f"{status}: {type(status)}")

gives RESULT_SUCCESS: <class 'str'> instead of the actual EnumResultGeneric.

It is a simple change to get this desired behavior in the to_dict method:

    elif meta.proto_type == TYPE_ENUM:
        enum_values = list(
            self._betterproto.cls_by_field[field.name]
        )  # type: ignore
        if isinstance(v, list):
            output[cased_name] = [enum_values[e] for e in v]
        else:
            output[cased_name] = enum_values[v]

Is this desirable for other people? Maybe allow this as a parameter to to_dict?

Gobot1234 commented 2 years ago

Maybe take a look at https://github.com/danielgtaylor/python-betterproto/pull/203

tcamise-gpsw commented 2 years ago

I just found https://github.com/danielgtaylor/python-betterproto/pull/293. which sounds quite similar Maybe this is the same?

tcamise-gpsw commented 2 years ago

Maybe take a look at #203

Thanks, that does look promising. I'll test it out and see if I can revive it.