+"""Module providing runtime utility objects to support the Micro/CircuitPython api"""
+
class Enum(object):
+ """
+ Object supporting CircuitPython-style of static symbols
+ as seen with Direction.OUTPUT, Pull.UP
+ """
+ def __repr__(self):
+ """
+ Assumes instance will be found as attribute of own class.
+ Returns dot-subscripted path to instance
+ (assuming absolute import of containing package)
+ """
+ cls = type(self)
+ for key in dir(cls):
+ if getattr(cls, key) is self:
+ return "{}.{}.{}".format(cls.__module__, cls.__qualname__, key)
+ return repr(self)
@classmethod
def iteritems(cls):
+ """
+ Inspects attributes of the class for instances of the class
+ and returns as key,value pairs mirroring dict#iteritems
+ """
for key in dir(cls):
val = getattr(cls, key)
if type(val) is cls:
yield (key, val)
- def __repr__(self):
- """
- Assumes instance will be found as attribute of own
- class. Returns dot-subscripted path to instance
- """
- cls = type(self)
- for key in dir(cls):
- if getattr(cls, key) is self:
- return "{}.{}.{}".format(cls.__module__, cls.__qualname__, key)
- return repr(self)
\ No newline at end of file
+class ContextManaged:
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.deinit()
+
+def Lockable(ContextManaged):
+ _locked = False
+
+ def try_lock(self):
+ if self._locked:
+ return False
+ else:
+ self._locked=True
+ return True
+
+ def unlock(self):
+ if self._locked:
+ self._locked = False
+ else:
+ raise ValueError("Not locked")