code: def _handle_reduce(self, ufunc, input_args, outputs):
          '''
          TODO: describe.
          TODO: For multi-dimensional case, might need extra work here if the reduction is being
          performed only along a certain axis.
          We force evaluation at the end of the reduction - weird errors if we don't. This seems
          safer anyway.
          np supports reduce only for binary ops.
          '''
          # input_args[0] must be self so it can be ignored.
          assert len(input_args) == 1
          if outputs: output = outputs[0]
          else: output = None
          if ufunc.__name__ in BINARY_OPS:
              return self._reduce_op(BINARY_OPS[ufunc.__name__], result=outputf _handle_reduce(self, ufunc, input_args, outputs):
          '''
          TODO: describe.
          TODO: For multi-dimensional case, might need extra work here if the reduction is being
          performed only along a certain axis.
          We force evaluation at the end of the reduction - weird errors if we don't. This seems
          safer anyway.
          np supports reduce only for binary ops.
          '''
          # input_args[0] must be self so it can be ignored.
          assert len(input_args) == 1
          if outputs: output = outputs[0]
          else: output = None
          if ufunc.__name__ in BINARY_OPS:
              return self._reduce_op(BINARY_OPS[ufunc.__name__], result=output)
docs: TODO: describe.
          TODO: For multi-dimensional case, might need extra work here if the reduction is being
          performed only along a certain axis.
          We force evaluation at the end of the reduction - weird errors if we don't. This seems
          safer anyway.
          np supports reduce only for binary ops.