Open Luminaar opened 4 years ago
It looks like the google.protobuf.Emtpy
type is not currently supported. Someone will need to implement it in python-betterproto.
As a workaround you can define your own empty message until this is done.
Howdy people!
The same issue happens when I tried to use Struct
.
from unbabelevents.chat_api import *
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-4950c13b1c3b> in <module>
----> 1 from unbabelevents.chat_api import *
~/chat_api.py in <module>
9
10 from . import commons
---> 11 from .google import protobuf
12
13
ModuleNotFoundError: No module named 'unbabelevents.google'
The proto file has the following message
syntax = "proto3";
import "google/protobuf/struct.proto";
message Nugget {
repeated google.protobuf.Struct alerts = 1;
}
And the generated python class is
import betterproto
from . import commons
from .google import protobuf
@dataclass
class Nugget(betterproto.Message):
qe_alerts: List[protobuf.Struct] = betterproto.message_field(1)
It looks like the
google.protobuf.Emtpy
type is not currently supported. Someone will need to implement it in python-betterproto.
There is a google.protobuf.empty_pb2.Empty
@devova yes but there are no generated dataclasses.
I made this module as a bandaid.
# proto_types.py
from dataclasses import dataclass
import betterproto
from google.protobuf import struct_pb2
@dataclass
class Struct(betterproto.Message):
def parse(self: betterproto.T, data: bytes) -> betterproto.T:
decoded = struct_pb2.Struct.FromString(data)
self.__dict__.update({item: value for item, value in decoded.items()})
return self
def __repr__(self):
return repr(self.__dict__)
@dataclass
class Empty(betterproto.Message):
def parse(self: betterproto.T, data: bytes) -> betterproto.T:
return self
And then a post-generating find and replace.
with open(file_path, 'r') as f:
lines = f.readlines()
with open(file_path, 'w') as f:
for line in lines:
line = line.replace("from .google import protobuf", "from wherever_proto_types_exists import proto_types")
line = line.replace('protobuf.Empty', 'proto_types.Empty')
line = line.replace('protobuf.Struct', 'proto_types.Struct')
f.write(line)
where file_path
is the path to the generated grpc python module
Fixed by #78?
Not Struct
, unfortunately. If Struct
is the only WKT used in your protobuf (as it is for me), you'll still have this dangling/invalid import. @adisunw 's patch fix at least unblocks the build, which is great.
Even easier than the find-replace that @adisunw provides above, if you just put that file in google/protobuf.py
relative to the imported files you're in business.
Is this what is needed? (along with the other types) https://github.com/danielgtaylor/python-betterproto/blob/master/src/betterproto/lib/google/protobuf/__init__.py#L1100
I am also impacted by this issue.
Is this still an issue? I am using wkt timestamp and it works for me with 2.0.0b5.
Seems like it's still an issue. The lack of support for Empty
, Value
and FieldMask
prevents me from using this (really nice!) library :(
wait, seems like all of them are already here 🤔 https://github.com/danielgtaylor/python-betterproto/blob/13d656587cd4f1211b12a0fc5d9dbaf04b2bca9d/src/betterproto/lib/google/protobuf/__init__.py#L1362
Any idea why there's no files under from .google import protobuf
? (generating using buf.build, if it matters)
Hello,
I'm not sure how to work with well known types.
Having a proto file like this:
I get output like this:
There is ofcourse no
google
package. I tried to generate code from proto files included ingrpc_tools
but I'm not able to get any python code.What is the best way to work with well known types?