local.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. def try_import(module):
  2. from importlib import import_module
  3. try:
  4. return import_module(module)
  5. except ImportError:
  6. pass
  7. class Proxy(object):
  8. """Code stolen from werkzeug.local.Proxy."""
  9. __slots__ = ('__local', '__dict__', '__name__')
  10. def __init__(self, local, name=None):
  11. object.__setattr__(self, '_Proxy__local', local)
  12. object.__setattr__(self, '__name__', name)
  13. def _get_current_object(self):
  14. """Return the current object. This is useful if you want the real
  15. object behind the proxy at a time for performance reasons or because
  16. you want to pass the object into a different context.
  17. """
  18. if not hasattr(self.__local, '__release_local__'):
  19. return self.__local()
  20. try:
  21. return getattr(self.__local, self.__name__)
  22. except AttributeError:
  23. raise RuntimeError('no object bound to %s' % self.__name__)
  24. @property
  25. def __dict__(self):
  26. try:
  27. return self._get_current_object().__dict__
  28. except RuntimeError:
  29. raise AttributeError('__dict__')
  30. def __repr__(self):
  31. try:
  32. obj = self._get_current_object()
  33. except RuntimeError:
  34. return '<%s unbound>' % self.__class__.__name__
  35. return repr(obj)
  36. def __nonzero__(self):
  37. try:
  38. return bool(self._get_current_object())
  39. except RuntimeError:
  40. return False
  41. def __unicode__(self):
  42. try:
  43. return unicode(self._get_current_object())
  44. except RuntimeError:
  45. return repr(self)
  46. def __dir__(self):
  47. try:
  48. return dir(self._get_current_object())
  49. except RuntimeError:
  50. return []
  51. def __getattr__(self, name):
  52. if name == '__members__':
  53. return dir(self._get_current_object())
  54. return getattr(self._get_current_object(), name)
  55. def __setitem__(self, key, value):
  56. self._get_current_object()[key] = value
  57. def __delitem__(self, key):
  58. del self._get_current_object()[key]
  59. def __setslice__(self, i, j, seq):
  60. self._get_current_object()[i:j] = seq
  61. def __delslice__(self, i, j):
  62. del self._get_current_object()[i:j]
  63. __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v)
  64. __delattr__ = lambda x, n: delattr(x._get_current_object(), n)
  65. __str__ = lambda x: str(x._get_current_object())
  66. __lt__ = lambda x, o: x._get_current_object() < o
  67. __le__ = lambda x, o: x._get_current_object() <= o
  68. __eq__ = lambda x, o: x._get_current_object() == o
  69. __ne__ = lambda x, o: x._get_current_object() != o
  70. __gt__ = lambda x, o: x._get_current_object() > o
  71. __ge__ = lambda x, o: x._get_current_object() >= o
  72. __cmp__ = lambda x, o: cmp(x._get_current_object(), o)
  73. __hash__ = lambda x: hash(x._get_current_object())
  74. __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw)
  75. __len__ = lambda x: len(x._get_current_object())
  76. __getitem__ = lambda x, i: x._get_current_object()[i]
  77. __iter__ = lambda x: iter(x._get_current_object())
  78. __contains__ = lambda x, i: i in x._get_current_object()
  79. __getslice__ = lambda x, i, j: x._get_current_object()[i:j]
  80. __add__ = lambda x, o: x._get_current_object() + o
  81. __sub__ = lambda x, o: x._get_current_object() - o
  82. __mul__ = lambda x, o: x._get_current_object() * o
  83. __floordiv__ = lambda x, o: x._get_current_object() // o
  84. __mod__ = lambda x, o: x._get_current_object() % o
  85. __divmod__ = lambda x, o: x._get_current_object().__divmod__(o)
  86. __pow__ = lambda x, o: x._get_current_object() ** o
  87. __lshift__ = lambda x, o: x._get_current_object() << o
  88. __rshift__ = lambda x, o: x._get_current_object() >> o
  89. __and__ = lambda x, o: x._get_current_object() & o
  90. __xor__ = lambda x, o: x._get_current_object() ^ o
  91. __or__ = lambda x, o: x._get_current_object() | o
  92. __div__ = lambda x, o: x._get_current_object().__div__(o)
  93. __truediv__ = lambda x, o: x._get_current_object().__truediv__(o)
  94. __neg__ = lambda x: -(x._get_current_object())
  95. __pos__ = lambda x: +(x._get_current_object())
  96. __abs__ = lambda x: abs(x._get_current_object())
  97. __invert__ = lambda x: ~(x._get_current_object())
  98. __complex__ = lambda x: complex(x._get_current_object())
  99. __int__ = lambda x: int(x._get_current_object())
  100. __long__ = lambda x: long(x._get_current_object())
  101. __float__ = lambda x: float(x._get_current_object())
  102. __oct__ = lambda x: oct(x._get_current_object())
  103. __hex__ = lambda x: hex(x._get_current_object())
  104. __index__ = lambda x: x._get_current_object().__index__()
  105. __coerce__ = lambda x, o: x.__coerce__(x, o)
  106. __enter__ = lambda x: x.__enter__()
  107. __exit__ = lambda x, *a, **kw: x.__exit__(*a, **kw)