Make namedtype creation compatible with older Python versions.
[coe.git] / coe / data.py
index b65dbae..f9fccb9 100644 (file)
@@ -1,4 +1,5 @@
 class symbol(object):
+    __slots__ = []
     isafe = set("abcdefghijklmnopqrstuvwxyz" +
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                 "$%^&*_=/.")
@@ -47,18 +48,15 @@ class symbol(object):
         return "%s:%s" % (self.quote(self.ns), self.quote(self.name))
 
 class usymbol(symbol):
+    __slots__ = ["name"]
     ns = ""
+
     def __init__(self, name):
         self.name = name
 
-    def __hash__(self):
-        return hash(self.name)
-    def __eq__(s, o):
-        if isinstance(o, str):
-            return s.name == o
-        return super().__eq__(o)
-
 class nssymbol(symbol):
+    __slots__ = ["ns", "name"]
+
     def __init__(self, ns, name, *args, **kw):
         super().__init__(*args, **kw)
         self.name = name
@@ -70,6 +68,12 @@ class namedtype(type):
         self.typename = typename
         return self
 
+    @classmethod
+    def make(cls, *args, typename=None, **kwargs):
+        self = cls(*args, **kwargs)
+        self.typename = typename
+        return self
+
 class obj(object):
     def __getitem__(self, key):
         return self.__dict__[key]
@@ -77,3 +81,8 @@ class obj(object):
         self.__dict__[key] = val
     def __delitem__(self, key):
         del self.__dict__[key]
+    def __getattr__(self, name):
+        try:
+            return self.__dict__[symbol.get("", name)]
+        except KeyError:
+            raise AttributeError(name) from None