code: def derivatives(self, **kwargs):
          
          # Call parent method
          super(CurveEvaluator2, self).derivatives(**kwargs)
  
          param = kwargs.get('parameter')
          deriv_order = kwargs.get('deriv_order', 0)
          degree = kwargs.get('degree')
          knotvector = kwargs.get('knotvector')
          ctrlpts = kwargs.get('ctrlpts')
          dimension = kwargs.get('dimension')
  
          # Algorithm A3.4
          du = min(degree, deriv_order)
  
          CK = [[0.0 for _ in range(dimension)] for _ in range(deriv_order + 1)]
  
          span = self._span_func(degree, knotvector, len(ctrlpts), param)
          bfuns = helpers.basis_function_all(degree, tuple(knotvector), span, param)
  
          # "derivatives_ctrlpts" is a static method that could be called like below
          PK = CurveEvaluator2.derivatives_ctrlpts(r1=(span - degree), r2=span,
                                                   degree=degree,
                                                   knotvector=knotvector,
                                                   ctrlpts=ctrlpts,
                                                   dimension=dimension,
                                                   deriv_order=du)
  
          for k in range(0, du + 1):
              for j in range(0, degree - k + 1):
                  CK[k][:] = [elem + (bfuns[j][degree - k] * drv_ctl_p) for elem, drv_ctl_p in
                              zip(CK[k], PK[k][j])]
  
          # Return the derivatives
          return CK
docs: Evaluates the derivatives at the input parameter.