Guest User

Untitled

a guest
Oct 21st, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. import threading
  2. from collections import defaultdict
  3. from io import StringIO
  4.  
  5.  
  6. def setdefaultattr(obj, name, value):
  7. if not hasattr(obj, name):
  8. setattr(obj, name, value)
  9. return getattr(obj, name)
  10.  
  11.  
  12. class ThreadLocalData:
  13. def __init__(self):
  14. self.threads_data = defaultdict(threading.local)
  15.  
  16. @property
  17. def thread_local(self):
  18. thread_id = threading.get_ident()
  19. local = self.threads_data[thread_id]
  20. return local
  21.  
  22. def del_thread_local(self):
  23. thread_id = threading.get_ident()
  24. self.threads_data.pop(thread_id, None)
  25.  
  26. def setdefault(self, name, value):
  27. return setdefaultattr(self.thread_local, name, value)
  28.  
  29. def get_property(self, name):
  30. rv = getattr(self.thread_local, name)
  31. if not rv:
  32. raise Exception("{} has not been set".format(name))
  33. return rv
  34.  
  35. @property
  36. def stdout(self):
  37. return self.setdefault("__stdout", StringIO())
  38.  
  39. @property
  40. def stderr(self):
  41. return self.setdefault("__stderr", StringIO())
  42.  
  43. def get_stdout_value(self):
  44. return self.stdout.getvalue()
  45.  
  46. def get_stderr_value(self):
  47. return self.stderr.getvalue()
  48.  
  49. def print(self, *args, **kwargs):
  50. print(*args, file=self.stdout, **kwargs)
  51.  
  52. def log(self, *args, **kwargs):
  53. print(*args, file=self.stderr, **kwargs)
Add Comment
Please, Sign In to add comment