Last active
August 28, 2017 11:29
-
-
Save justdoit0823/7748af1d5900d20cc5257f6a24562c63 to your computer and use it in GitHub Desktop.
why field with default value doesn't exist in protobuf 3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def _AddPropertiesForNonRepeatedScalarField(field, cls): | |
"""Adds a public property for a nonrepeated, scalar protocol message field. | |
Clients can use this property to get and directly set the value of the field. | |
Note that when the client sets the value of a field by using this property, | |
all necessary "has" bits are set as a side-effect, and we also perform | |
type-checking. | |
Args: | |
field: A FieldDescriptor for this field. | |
cls: The class we're constructing. | |
""" | |
proto_field_name = field.name | |
property_name = _PropertyName(proto_field_name) | |
type_checker = type_checkers.GetTypeChecker(field) | |
default_value = field.default_value | |
valid_values = set() | |
is_proto3 = field.containing_type.syntax == "proto3" | |
def getter(self): | |
# TODO(protobuf-team): This may be broken since there may not be | |
# default_value. Combine with has_default_value somehow. | |
return self._fields.get(field, default_value) | |
getter.__module__ = None | |
getter.__doc__ = 'Getter for %s.' % proto_field_name | |
clear_when_set_to_default = is_proto3 and not field.containing_oneof | |
def field_setter(self, new_value): | |
# pylint: disable=protected-access | |
# Testing the value for truthiness captures all of the proto3 defaults | |
# (0, 0.0, enum 0, and False). | |
new_value = type_checker.CheckValue(new_value) | |
if clear_when_set_to_default and not new_value: | |
self._fields.pop(field, None) | |
else: | |
self._fields[field] = new_value | |
# Check _cached_byte_size_dirty inline to improve performance, since scalar | |
# setters are called frequently. | |
if not self._cached_byte_size_dirty: | |
self._Modified() | |
if field.containing_oneof: | |
def setter(self, new_value): | |
field_setter(self, new_value) | |
self._UpdateOneofState(field) | |
else: | |
setter = field_setter | |
setter.__module__ = None | |
setter.__doc__ = 'Setter for %s.' % proto_field_name | |
# Add a property to encapsulate the getter/setter. | |
doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name | |
setattr(cls, property_name, property(getter, setter, doc=doc)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment