@@ -46,30 +46,69 @@ def __memoryview_init(self, *args, **kwargs):
46
46
47
47
return __memoryview_init
48
48
49
+
49
50
def make_getitem ():
50
51
def __memoryview_getitem (self , key ):
51
52
res = self .__c_memoryview .__getitem__ (key )
52
53
return memoryview (res ) if isinstance (res , type (self .__c_memoryview )) else res
53
54
return __memoryview_getitem
54
55
55
- def make_readonly ():
56
- class Dummy :
57
- @property
58
- def readonly (self ):
59
- return self .__c_memoryview .readonly
60
56
61
- @readonly .setter
62
- def readonly (self , value ):
63
- raise AttributeError ("attribute 'readonly' of 'memoryview' objects is not writable" )
64
- return Dummy .readonly
57
+ def make_property (name ):
58
+ template = """def {0}_getter(self):
59
+ return self.__c_memoryview.{0}
60
+
61
+ {0} = property({0}_getter)
62
+
63
+ def {0}_setter(self, value):
64
+ raise AttributeError("attribute '{0}' of 'memoryview' objects is not writable")
65
+
66
+ {0} = {0}.setter({0}_setter)"""
67
+ # use dict for globals and locals to avoid name conflicts
68
+ _globals = dict (globals ())
69
+ _locals = dict ()
70
+ exec (template .format (name ), _globals , _locals )
71
+ return eval (name , _globals , _locals )
65
72
73
+
74
+ # delegate methods
66
75
memoryview .__init__ = make_init ()
67
76
memoryview .__repr__ = lambda self : self .__c_memoryview .__repr__ ()
68
77
memoryview .__len__ = lambda self : self .__c_memoryview .__len__ ()
69
78
memoryview .__getitem__ = make_getitem ()
70
79
memoryview .__setitem__ = lambda self , key , value : self .__c_memoryview .__setitem__ (key , value )
71
- memoryview .readonly = make_readonly ()
80
+ memoryview .release = lambda self : self .__c_memoryview .release ()
81
+ memoryview .tobytes = lambda self : self .__c_memoryview .tobytes ()
82
+ memoryview .hex = lambda self : self .__c_memoryview .hex ()
83
+ memoryview .tolist = lambda self : self .__c_memoryview .tolist ()
84
+ memoryview .cast = lambda self , * args : self .__c_memoryview .cast (* args )
85
+ memoryview .__enter__ = lambda self : self .__c_memoryview .__enter__ ()
86
+ memoryview .__exit__ = lambda self : self .__c_memoryview .__exit__ ()
87
+
88
+ # delegate properties
89
+ memoryview .nbytes = make_property ("nbytes" )
90
+ memoryview .readonly = make_property ("readonly" )
91
+ memoryview .itemsize = make_property ("itemsize" )
92
+ memoryview .format = make_property ("format" )
93
+ memoryview .ndim = make_property ("ndim" )
94
+ memoryview .shape = make_property ("shape" )
95
+ memoryview .strides = make_property ("strides" )
96
+ memoryview .suboffsets = make_property ("suboffsets" )
97
+ memoryview .c_contiguous = make_property ("c_contiguous" )
98
+ memoryview .f_contiguous = make_property ("f_contiguous" )
99
+ memoryview .contiguous = make_property ("contiguous" )
100
+
72
101
73
102
del make_init
74
103
del make_getitem
75
- del make_readonly
104
+ # del make_nbytes
105
+ # del make_readonly
106
+ # del make_itemsize
107
+ # del make_format
108
+ # del make_ndim
109
+ # del make_shape
110
+ # del make_strides
111
+ # del make_suboffsets
112
+ # del make_c_contiguous
113
+ # del make_f_contiguous
114
+ # del make_contiguous
0 commit comments