# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved. #
# This file is part of the AiiDA code. #
# #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file #
# For further information please visit http://www.aiida.net #
###########################################################################
"""Module for defintion of base `Data` sub class for numeric based data types."""
from .base import to_aiida_type, BaseType
__all__ = ('NumericType',)
def _left_operator(func):
"""Function decorator to treat a method as the left operator."""
def inner(self, other):
"""Decorator wrapper."""
left = self.value
if isinstance(other, NumericType):
right = other.value
else:
right = other
return to_aiida_type(func(left, right))
return inner
def _right_operator(func):
"""Function decorator to treat a method as the right operator."""
def inner(self, other):
"""Decorator wrapper."""
assert not isinstance(other, NumericType)
return to_aiida_type(func(self.value, other))
return inner
[docs]class NumericType(BaseType):
"""Sub class of Data to store numbers, overloading common operators (``+``, ``*``, ...)."""
[docs] @_left_operator
def __add__(self, other):
return self + other
[docs] @_right_operator
def __radd__(self, other):
return other + self
[docs] @_left_operator
def __sub__(self, other):
return self - other
[docs] @_right_operator
def __rsub__(self, other):
return other - self
[docs] @_left_operator
def __mul__(self, other):
return self * other
[docs] @_right_operator
def __rmul__(self, other):
return other * self
[docs] @_left_operator
def __div__(self, other):
return self / other
[docs] @_right_operator
def __rdiv__(self, other):
return other / self
[docs] @_left_operator
def __truediv__(self, other):
return self / other
[docs] @_right_operator
def __rtruediv__(self, other):
return other / self
[docs] @_left_operator
def __floordiv__(self, other):
return self // other
[docs] @_right_operator
def __rfloordiv__(self, other):
return other // self
[docs] @_left_operator
def __pow__(self, power):
return self**power
[docs] @_left_operator
def __lt__(self, other):
return self < other
[docs] @_left_operator
def __le__(self, other):
return self <= other
[docs] @_left_operator
def __gt__(self, other):
return self > other
[docs] @_left_operator
def __ge__(self, other):
return self >= other
[docs] @_left_operator
def __mod__(self, other):
return self % other
[docs] @_right_operator
def __rmod__(self, other):
return other % self
[docs] def __float__(self):
return float(self.value)
[docs] def __int__(self):
return int(self.value)