code: def get_signature_params(func):
      
      # The first condition for Cython functions, the latter for Cython instance
      # methods
      if is_cython(func):
          attrs = [
              "__code__", "__annotations__", "__defaults__", "__kwdefaults__"
          ]
  
          if all(hasattr(func, attr) for attr in attrs):
              original_func = func
  
              def func():
                  return
  
              for attr in attrs:
                  setattr(func, attr, getattr(original_func, attr))
          else:
              raise TypeError("{!r} is not a Python function we can process"
                              .format(func))
  
      return list(funcsigs.signature(func).parameters.items())
docs: Get signature parameters
  
      Support Cython functions by grabbing relevant attributes from the Cython
      function and attaching to a no-op function. This is somewhat brittle, since
      funcsigs may change, but given that funcsigs is written to a PEP, we hope
      it is relatively stable. Future versions of Python may allow overloading
      the inspect 'isfunction' and 'ismethod' functions / create ABC for Python
      functions. Until then, it appears that Cython won't do anything about
      compatability with the inspect module.
  
      Args:
          func: The function whose signature should be checked.
  
      Raises:
          TypeError: A type error if the signature is not supported