Coverage for python/lsst/afw/image/image/_disableArithmetic.py: 76%

15 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-04-13 02:49 -0700

1# This file is part of afw. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

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

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

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

12# (at your option) any later version. 

13# 

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

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

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

17# GNU General Public License for more details. 

18# 

19# You should have received a copy of the GNU General Public License 

20# along with this program. If not, see <https://www.gnu.org/licenses/>. 

21 

22from ._imageLib import ImageSliceF, ImageSliceD 

23 

24__all__ = ("disableImageArithmetic", "disableMaskArithmetic") 

25 

26 

27def wrapNotImplemented(cls, attr): 

28 """Wrap a method providing a helpful error message about image arithmetic 

29 

30 Parameters 

31 ---------- 

32 cls : `type` 

33 Class in which the method is to be defined. 

34 attr : `str` 

35 Name of the method. 

36 

37 Returns 

38 ------- 

39 method : callable 

40 Wrapped method. 

41 """ 

42 existing = getattr(cls, attr, None) 

43 

44 def notImplemented(self, other): 

45 """Provide a helpful error message about image arithmetic 

46 

47 Unless we're operating on an ImageSlice, in which case it might be 

48 defined. 

49 

50 Parameters 

51 ---------- 

52 self : subclass of `lsst.afw.image.ImageBase` 

53 Image someone's attempting to do arithmetic with. 

54 other : anything 

55 The operand of the arithmetic operation. 

56 """ 

57 if existing is not None and isinstance(other, (ImageSliceF, ImageSliceD)): 

58 return existing(self, other) 

59 raise NotImplementedError("This arithmetic operation is not implemented, in order to prevent the " 

60 "accidental proliferation of temporaries. Please use the in-place " 

61 "arithmetic operations (e.g., += instead of +) or operate on the " 

62 "underlying arrays.") 

63 return notImplemented 

64 

65 

66def disableImageArithmetic(cls): 

67 """Add helpful error messages about image arithmetic""" 

68 for attr in ("__add__", "__sub__", "__mul__", "__truediv__", 

69 "__radd__", "__rsub__", "__rmul__", "__rtruediv__"): 

70 setattr(cls, attr, wrapNotImplemented(cls, attr)) 

71 

72 

73def disableMaskArithmetic(cls): 

74 """Add helpful error messages about mask arithmetic""" 

75 for attr in ("__or__", "__and__", "__xor__", 

76 "__ror__", "__rand__", "__rxor__"): 

77 setattr(cls, attr, wrapNotImplemented(cls, attr))