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.

Reply via email to