code: def _make_repr(attrs, ns):
      
      attr_names = tuple(a.name for a in attrs if a.repr)
  
      def __repr__(self):
          """
          Automatically created by attrs.
          """
          try:
              working_set = _already_repring.working_set
          except AttributeError:
              working_set = set()
              _already_repring.working_set = working_set
  
          if id(self) in working_set:
              return "..."
          real_cls = self.__class__
          if ns is None:
              qualname = getattr(real_cls, "__qualname__", None)
              if qualname is not None:
                  class_name = qualname.rsplit(">.", 1)[-1]
              else:
                  class_name = real_cls.__name__
          else:
              class_name = ns + "." + real_cls.__name__
  
          # Since 'self' remains on the stack (i.e.: strongly referenced) for the
          # duration of this call, it's safe to depend on id(...) stability, and
          # not need to track the instance and therefore worry about properties
          # like weakref- or hash-ability.
          working_set.add(id(self))
          try:
              result = [class_name, "("]
              first = True
              for name in attr_names:
                  if first:
                      first = False
                  else:
                      result.append(", ")
                  result.extend((name, "=", repr(getattr(self, name, NOTHING))))
              return "".join(result) + ")"
          finally:
              working_set.remove(id(self))
  
      return __repr__
docs: Make a repr method for *attr_names* adding *ns* to the full name.