code: def call_member(obj, f, *args, **kwargs):
      
      # get function name
      if not isinstance(f, str):
          fname = f.__func__.__name__
      else:
          fname = f
      # get the method ref
      method = getattr(obj, fname)
      # handle cases
      if inspect.ismethod(method):
          return method(*args, **kwargs)
  
      # attribute or property
      return method
docs: Calls the specified method, property or attribute of the given object
  
      Parameters
      ----------
      obj : object
          The object that will be used
      f : str or function
          Name of or reference to method, property or attribute
      failfast : bool
          If True, will raise an exception when trying a method that doesn't exist. If False, will simply return None
          in that case