code: def iter_generic_bases(type_):
      
      for t in type_.__mro__:
          if not isinstance(t, typing.GenericMeta):
              continue
          yield t
          t = t.__origin__
          while t:
              yield t
              t = t.__origin__
docs: Iterates over all generics `type_` derives from, including origins.
  
      This function is only necessary because, in typing 3.5.0, a generic doesn't
      get included in the list of bases when it constructs a parameterized version
      of itself. This was fixed in aab2c59; now it would be enough to just iterate
      over the MRO.