Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1#!/usr/bin/env python 

2 

3# 

4# LSST Data Management System 

5# Copyright 2008, 2009, 2010 LSST Corporation. 

6# 

7# This product includes software developed by the 

8# LSST Project (http://www.lsst.org/). 

9# 

10# This program is free software: you can redistribute it and/or modify 

11# it under the terms of the GNU General Public License as published by 

12# the Free Software Foundation, either version 3 of the License, or 

13# (at your option) any later version. 

14# 

15# This program is distributed in the hope that it will be useful, 

16# but WITHOUT ANY WARRANTY; without even the implied warranty of 

17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

18# GNU General Public License for more details. 

19# 

20# You should have received a copy of the LSST License Statement and 

21# the GNU General Public License along with this program. If not, 

22# see <http://www.lsstcorp.org/LegalNotices/>. 

23# 

24 

25# -*- python -*- 

26 

27"""This module defines the ReadProxy class.""" 

28 

29from .persistence import ReadProxyBase 

30 

31 

32class ReadProxy(ReadProxyBase): 

33 """ReadProxy provides a lazy-loading object that is initialized by a 

34 callback function set in ReadProxy's constructor. Adapted from 

35 peak.util.proxies.LazyProxy, which was written by Phillip J. Eby 

36 (peak@eby-sarna.com).""" 

37 

38 __slots__ = ('__cache__', '__callback__') 

39 

40 def __init__(self, func): 

41 set_callback(self, func) 

42 

43 def __getattr__(self, attr): 

44 getattr(self.__subject__, attr) 

45 

46 def __setattr__(self, attr, val): 

47 setattr(self.__subject__, attr, val) 

48 

49 def __delattr__(self, attr): 

50 delattr(self.__subject__, attr) 

51 

52 def __bool__(self): 

53 return bool(self.__subject__) 

54 

55 def __getitem__(self, arg): 

56 return self.__subject__[arg] 

57 

58 def __setitem__(self, arg, val): 

59 self.__subject__[arg] = val 

60 

61 def __delitem__(self, arg): 

62 del self.__subject__[arg] 

63 

64 def __getslice__(self, i, j): 

65 return self.__subject__[i:j] 

66 

67 def __setslice__(self, i, j, val): 

68 self.__subject__[i:j] = val 

69 

70 def __delslice__(self, i, j): 

71 del self.__subject__[i:j] 

72 

73 def __contains__(self, ob): 

74 return ob in self.__subject__ 

75 

76 for name in 'repr str hash len abs complex int long float iter oct hex'.split(): 

77 exec("def __%s__(self): return %s(self.__subject__)" % (name, name)) 

78 

79 for name in 'cmp', 'coerce', 'divmod': 

80 exec("def __%s__(self, ob): return %s(self.__subject__, ob)" % (name, 

81 name)) 

82 

83 for name, op in [ 

84 ('lt', '<'), ('gt', '>'), ('le', '<='), ('ge', '>='), 

85 ('eq', '=='), ('ne', '!=') 

86 ]: 

87 exec("def __%s__(self, ob): return self.__subject__ %s ob" % (name, op)) 

88 

89 for name, op in [('neg', '-'), ('pos', '+'), ('invert', '~')]: 

90 exec("def __%s__(self): return %s self.__subject__" % (name, op)) 

91 

92 for name, op in [ 

93 ('or', '|'), ('and', '&'), ('xor', '^'), 

94 ('lshift', '<<'), ('rshift', '>>'), 

95 ('add', '+'), ('sub', '-'), ('mul', '*'), ('div', '/'), 

96 ('mod', '%'), ('truediv', '/'), ('floordiv', '//') 

97 ]: 

98 exec(( 

99 "def __%(name)s__(self,ob):\n" 

100 " return self.__subject__ %(op)s ob\n" 

101 "\n" 

102 "def __r%(name)s__(self,ob):\n" 

103 " return ob %(op)s self.__subject__\n" 

104 "\n" 

105 "def __i%(name)s__(self,ob):\n" 

106 " self.__subject__ %(op)s=ob\n" 

107 " return self\n" 

108 ) % locals()) 

109 

110 del name, op 

111 

112 # Oddball signatures 

113 

114 def __rdivmod__(self, ob): 

115 return divmod(ob, self.__subject__) 

116 

117 def __pow__(self, *args): 

118 return pow(self.__subject__, *args) 

119 

120 def __ipow__(self, ob): 

121 self.__subject__ **= ob 

122 return self 

123 

124 def __rpow__(self, ob): 

125 return pow(ob, self.__subject__) 

126 

127 

128get_callback = ReadProxy.__callback__.__get__ 

129set_callback = ReadProxy.__callback__.__set__ 

130get_cache = ReadProxy.__cache__.__get__ 

131set_cache = ReadProxy.__cache__.__set__ 

132 

133 

134def _subject(self, get_cache=get_cache, set_cache=set_cache): 

135 try: 

136 return get_cache(self) 

137 except AttributeError: 

138 set_cache(self, get_callback(self)()) 

139 return get_cache(self) 

140 

141 

142ReadProxy.__subject__ = property(_subject, set_cache) 

143del _subject