_compat.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env python
  2. # $Id: _compat.py 1117 2012-11-02 19:45:33Z g.rodola $
  3. """
  4. Compatibility module similar to six which helps maintaining
  5. a single code base working with python from 2.4 to 3.x.
  6. """
  7. import sys
  8. import os
  9. PY3 = sys.version_info[0] == 3
  10. if PY3:
  11. import builtins
  12. def u(s):
  13. return s
  14. def b(s):
  15. return s.encode("latin-1")
  16. print_ = getattr(builtins, "print")
  17. getcwdu = os.getcwd
  18. unicode = str
  19. xrange = range
  20. else:
  21. def u(s):
  22. return unicode(s)
  23. def b(s):
  24. return s
  25. def print_(s):
  26. sys.stdout.write(s + '\n')
  27. sys.stdout.flush()
  28. getcwdu = os.getcwdu
  29. unicode = unicode
  30. xrange = xrange
  31. # introduced in 2.6
  32. if hasattr(sys, 'maxsize'):
  33. MAXSIZE = sys.maxsize
  34. else:
  35. class X(object):
  36. def __len__(self):
  37. return 1 << 31
  38. try:
  39. len(X())
  40. except OverflowError:
  41. MAXSIZE = int((1 << 31) - 1) # 32-bit
  42. else:
  43. MAXSIZE = int((1 << 63) - 1) # 64-bit
  44. del X
  45. # removed in 3.0, reintroduced in 3.2
  46. try:
  47. callable = callable
  48. except Exception:
  49. def callable(obj):
  50. for klass in type(obj).__mro__:
  51. if "__call__" in klass.__dict__:
  52. return True
  53. return False
  54. # introduced in 2.6
  55. _default = object()
  56. try:
  57. next = next
  58. except NameError:
  59. def next(iterable, default=_default):
  60. if default == _default:
  61. return iterable.next()
  62. else:
  63. try:
  64. return iterable.next()
  65. except StopIteration:
  66. return default
  67. # dirty hack to support property.setter on python < 2.6
  68. property = property
  69. if not hasattr(property, "setter"):
  70. class property(property):
  71. def setter(self, value):
  72. cls_ns = sys._getframe(1).f_locals
  73. for k, v in cls_ns.iteritems():
  74. if v == self:
  75. name = k
  76. break
  77. cls_ns[name] = property(self.fget, value, self.fdel, self.__doc__)
  78. return cls_ns[name]