docs: def init_arg_names(obj):
      """
      Names of arguments to __init__ method of this object's class.
      """
      # doing something wildly hacky by pulling out the arguments to
      # __init__ or __new__ and hoping that they match fields defined on the
      # object
      try:
          init_code = obj.__init__.__func__.__code__
      except AttributeError:
          try:
              init_code = obj.__new__.__func__.__code__
          except AttributeError:
              # if object is a namedtuple then we can return its fields
              # as the required initial args
              if hasattr(obj, "_fields"):
                  return obj._fields
              else:
                  raise ValueError("Cannot determine args to %s.__init__" % (obj,))
  
      arg_names = init_code.co_varnames[:init_code.co_argcount]
      # drop self argument
      nonself_arg_names = arg_names[1:]
      return nonself_arg_names