In generale, ho una definizione protobuf che utilizzava una parola chiave Python "from". Funziona in Java/C#/C++, ma quando arriva a Python, non posso assegnargli alcun valore.viene utilizzata in protobuf in Python
Ecco il dettaglio del mio problema.
Ho una definizione protobuf come di seguito:
message Foo
{
required int64 from = 10
...
}
Dal momento che il campo "da" è una parola chiave in Python, dopo aver generato il codice Python, non ho potuto compilare il codice, come di seguito:
foo = Foo()
foo.from = 1234
Poi, ho cercato di usare setattr() per impostare l'attributo:
setattr(foo, 'from', 1234)
che mi dà un'eccezione Protobuf:
AttributeError: Assignment not allowed to composite field "from" in protocol message object.
non ho potuto cambiare la definizione in questo momento perché è stato ampiamente utilizzato nel sistema. Qualsiasi aiuto sarebbe apprezzato se riesco a trovare un modo per usare l'attributo "from" in Python.
riportano di seguito le protobuf codice generato:
import sys
_FOO = _descriptor.Descriptor(
name='Foo',
full_name='com.kerneljoy.Foo',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='from', full_name='com.kerneljoy.Foo.from', index=0,
number=10, type=3, cpp_type=2, label=2,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
extension_ranges=[],
oneofs=[
],
serialized_start=28,
serialized_end=47,
)
DESCRIPTOR.message_types_by_name['Foo'] = _FOO
Foo = _reflection.GeneratedProtocolMessageType('Foo', (_message.Message,), dict(
DESCRIPTOR = _FOO,
__module__ = 'Foo_pb2'
# @@protoc_insertion_point(class_scope:com.kerneljoy.Foo)
))
_sym_db.RegisterMessage(Foo)
Non ho mai usato buffer di protocollo prima, ma un idioma comune in Python è di apporre un sottolineare a una parola riservata se si desidera utilizzarlo come identificatore. Forse l'implementazione Python fa la stessa cosa? 'foo = Foo(); foo.from_ = 1234'. – chepner
Interessante domanda. Potresti per favore postare il codice Python risultante generato da protobuf? O da un esempio di lavoro minimo, se non puoi pubblicare l'originale. – Unapiedra
@chepner grazie! Ho provato anche questo. ma sembra che non funzioni. Riporterà l'errore che da_ non è definito. – kerneljoy