With python (versions 3.6.9, 3.8.2, at least) if I create a pb2 Struct and
try to access a non-existent field from that struct, a ValueError is
raised, but that field is created as a side-effect.
Furthermore the field is created without a type such that it cannot be
marshalled.
E.g. (using protobuf-3.11.3):
#!/usr/bin/env python
import google.protobuf.struct_pb2
s = google.protobuf.struct_pb2.Struct()
s['valid_str_key'] = 'blah'
s['valid_null_key'] = None
print(f"Struct(before): >>>{s}<<<")
try:
v = s['bogus_key']
except ValueError:
pass
print(f"Struct(after): >>>{s}<<<")
assert 'bogus_key' not in s, "Struct should not contain 'bogus_key'"
When I run this, I get the following output:
Struct(before): >>>fields {
key: "valid_null_key"
value {
null_value: NULL_VALUE
}
}
fields {
key: "valid_str_key"
value {
string_value: "blah"
}
}
<<<
Struct(after): >>>fields {
key: "bogus_key"
value {
}
}
fields {
key: "valid_null_key"
value {
null_value: NULL_VALUE
}
}
fields {
key: "valid_str_key"
value {
string_value: "blah"
}
}
<<<
Traceback (most recent call last):
File "pb2_struct_min_reproducer.py", line 15, in <module>
assert 'bogus_key' not in s, "Struct should not contain 'bogus_key'"
AssertionError: Struct should not contain 'bogus_key'
- the 'bogus_key' field now exists, which I wouldn't have expected.
- it appears to have no type (compared with str_value/null_value for the
other two fields). This causes marshalling problems for at least golang if
it receives that struct over the wire and tries to marshall it.
Is this expected behaviour somehow?
Thanks,
Manuel.
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/2503601c-db02-4ddd-b511-bd0eb1a7e007%40googlegroups.com.