Coverage for python/lsst/daf/persistence/readProxy.py: 68%

61 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2022-09-07 09:51 +0000

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 ReadProxyBase.__init__(self) 

42 set_callback(self, func) 

43 

44 def __getattr__(self, attr): 

45 getattr(self.__subject__, attr) 

46 

47 def __setattr__(self, attr, val): 

48 setattr(self.__subject__, attr, val) 

49 

50 def __delattr__(self, attr): 

51 delattr(self.__subject__, attr) 

52 

53 def __bool__(self): 

54 return bool(self.__subject__) 

55 

56 def __getitem__(self, arg): 

57 return self.__subject__[arg] 

58 

59 def __setitem__(self, arg, val): 

60 self.__subject__[arg] = val 

61 

62 def __delitem__(self, arg): 

63 del self.__subject__[arg] 

64 

65 def __getslice__(self, i, j): 

66 return self.__subject__[i:j] 

67 

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

69 self.__subject__[i:j] = val 

70 

71 def __delslice__(self, i, j): 

72 del self.__subject__[i:j] 

73 

74 def __contains__(self, ob): 

75 return ob in self.__subject__ 

76 

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

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

79 

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

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

82 name)) 

83 

84 for name, op in [ 

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

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

87 ]: 

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

89 

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

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

92 

93 for name, op in [ 

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

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

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

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

98 ]: 

99 exec(( 

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

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

102 "\n" 

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

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

105 "\n" 

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

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

108 " return self\n" 

109 ) % locals()) 

110 

111 del name, op 

112 

113 # Oddball signatures 

114 

115 def __rdivmod__(self, ob): 

116 return divmod(ob, self.__subject__) 

117 

118 def __pow__(self, *args): 

119 return pow(self.__subject__, *args) 

120 

121 def __ipow__(self, ob): 

122 self.__subject__ **= ob 

123 return self 

124 

125 def __rpow__(self, ob): 

126 return pow(ob, self.__subject__) 

127 

128 

129get_callback = ReadProxy.__callback__.__get__ 

130set_callback = ReadProxy.__callback__.__set__ 

131get_cache = ReadProxy.__cache__.__get__ 

132set_cache = ReadProxy.__cache__.__set__ 

133 

134 

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

136 try: 

137 return get_cache(self) 

138 except AttributeError: 

139 set_cache(self, get_callback(self)()) 

140 return get_cache(self) 

141 

142 

143ReadProxy.__subject__ = property(_subject, set_cache) 

144del _subject