ee_number.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env python
  2. """A wrapper for numbers."""
  3. import numbers
  4. from . import _cloud_api_utils
  5. from . import apifunction
  6. from . import computedobject
  7. from . import ee_exception
  8. # Using lowercase function naming to match the JavaScript names.
  9. # pylint: disable=g-bad-name
  10. class Number(computedobject.ComputedObject):
  11. """An object to represent numbers."""
  12. _initialized = False
  13. # Tell pytype to not complain about dynamic attributes.
  14. _HAS_DYNAMIC_ATTRIBUTES = True
  15. def __init__(self, number):
  16. """Construct a number wrapper.
  17. This constructor accepts the following args:
  18. 1) A bare number.
  19. 2) A ComputedObject returning a number.
  20. Args:
  21. number: The number to wrap.
  22. """
  23. self.initialize()
  24. if isinstance(number, numbers.Number):
  25. super(Number, self).__init__(None, None)
  26. self._number = number
  27. elif isinstance(number, computedobject.ComputedObject):
  28. super(Number, self).__init__(number.func, number.args, number.varName)
  29. self._number = None
  30. else:
  31. raise ee_exception.EEException(
  32. 'Invalid argument specified for ee.Number(): %s' % number)
  33. @classmethod
  34. def initialize(cls):
  35. """Imports API functions to this class."""
  36. if not cls._initialized:
  37. apifunction.ApiFunction.importApi(cls, 'Number', 'Number')
  38. cls._initialized = True
  39. @classmethod
  40. def reset(cls):
  41. """Removes imported API functions from this class."""
  42. apifunction.ApiFunction.clearApi(cls)
  43. cls._initialized = False
  44. @staticmethod
  45. def name():
  46. return 'Number'
  47. def encode(self, opt_encoder=None):
  48. if isinstance(self._number, numbers.Number):
  49. return self._number
  50. else:
  51. return super(Number, self).encode(opt_encoder)
  52. def encode_cloud_value(self, opt_encoder=None):
  53. if isinstance(self._number, numbers.Number):
  54. return _cloud_api_utils.encode_number_as_cloud_value(self._number)
  55. else:
  56. return super(Number, self).encode_cloud_value(opt_encoder)