Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.94 KB | None | 0 0
  1. empty = None
  2. deep = dict(a=dict(b='c'))
  3.  
  4.  
  5. def chain_optional(func, default_value=None):
  6. try:
  7. return func()
  8. except AttributeError:
  9. return default_value
  10. except TypeError:
  11. return default_value
  12.  
  13. assert chain_optional(lambda: empty.test) is None
  14. assert chain_optional(lambda: deep['a']['b']) is 'c'
  15.  
  16.  
  17. EMPTY_IDENTIFIER = object()
  18. class Optional(object):
  19. def __init__(self, item=EMPTY_IDENTIFIER, default_value=None):
  20. self.item = item
  21. self.default_value = None
  22.  
  23. def __getattr__(self, name):
  24. if isinstance(self.item, dict):
  25. return Optional(self.item.get(name, EMPTY_IDENTIFIER))
  26. elif hasattr(self.item, name):
  27. return Optional(getattr(self.item, name))
  28. else:
  29. return Optional()
  30.  
  31. def __call__(self):
  32. return self.default_value if self.item is EMPTY_IDENTIFIER else self.item
  33.  
  34. assert Optional(empty).test() is None
  35. assert Optional(deep).a.b() is 'c'
  36. assert Optional(deep).a.b.c.d() is None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement