code: def from_type_name(cls, typ, name):
          
          # Try aliases first.
          for k, nt in cls.defined_aliases.items():
              if typ is not None and typ != nt.type: continue
              #print(name, nt.name)
              if name == nt.name:
                  if len(k) == 1: return cls(xc=k)
                  if len(k) == 2: return cls(x=k[0], c=k[1])
                  raise ValueError("Wrong key: %s" % k)
  
          # At this point, we should have something in the form
          # name="GGA_X_PBE+GGA_C_PBE" or  name=""LDA_XC_TETER93"
          if "+" in name:
              #if typ is not None: raise ValueError("typ: `%s` but name: `%s`" % (typ, name))
              x, c = (s.strip() for s in name.split("+"))
              x, c = LibxcFunc[x], LibxcFunc[c]
              return cls(x=x, c=c)
          else:
              #if typ is not None: raise ValueError("typ: `%s` but name: `%s`" % (typ, name))
              xc = LibxcFunc[name]
              return cls(xc=xc)
  
          if typ is None:
              raise ValueError("Cannot find name=%s in defined_aliases" % name)
          else:
              raise ValueError("Cannot find type=%s, name=%s in defined_aliases" % (typ, name))
docs: Build the object from (type, name).