|
39 | 39 |
|
40 | 40 | # memoryview is mainly implemented in C
|
41 | 41 |
|
42 |
| -def make_init(): |
43 |
| - def __memoryview_init(self, *args, **kwargs): |
44 |
| - import _memoryview |
45 |
| - self.__c_memoryview = _memoryview.nativememoryview(*args, **kwargs) |
46 | 42 |
|
47 |
| - return __memoryview_init |
| 43 | +def __memoryview_init(self, *args, **kwargs): |
| 44 | + import _memoryview |
| 45 | + self.__c_memoryview = _memoryview.nativememoryview(*args, **kwargs) |
48 | 46 |
|
49 | 47 |
|
50 |
| -def make_getitem(): |
51 |
| - def __memoryview_getitem(self, key): |
52 |
| - res = self.__c_memoryview.__getitem__(key) |
53 |
| - return memoryview(res) if isinstance(res, type(self.__c_memoryview)) else res |
54 |
| - return __memoryview_getitem |
| 48 | +def __memoryview_getitem(self, key): |
| 49 | + res = self.__c_memoryview.__getitem__(key) |
| 50 | + return memoryview(res) if isinstance(res, type(self.__c_memoryview)) else res |
55 | 51 |
|
56 | 52 |
|
57 | 53 | def make_property(name):
|
58 |
| - template = """def {0}_getter(self): |
59 |
| - return self.__c_memoryview.{0} |
| 54 | + @property |
| 55 | + def getter(self): |
| 56 | + return getattr(self.__c_memoryview, name) |
60 | 57 |
|
61 |
| -{0} = property({0}_getter) |
| 58 | + error_string = "attribute '%s' of 'memoryview' objects is not writable" % name |
| 59 | + @getter.setter |
| 60 | + def setter(self, value): |
| 61 | + raise AttributeError(error_string) |
62 | 62 |
|
63 |
| -def {0}_setter(self, value): |
64 |
| - raise AttributeError("attribute '{0}' of 'memoryview' objects is not writable") |
| 63 | + getter.__name__ = name |
| 64 | + return getter |
65 | 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) |
72 | 66 |
|
| 67 | +for p in ["nbytes", "readonly", "itemsize", "format", "ndim", "shape", "strides", |
| 68 | + "suboffsets", "c_contiguous", "f_contiguous", "contiguous"]: |
| 69 | + setattr(memoryview, p, make_property(p)) |
73 | 70 |
|
74 |
| -# delegate methods |
75 |
| -memoryview.__init__ = make_init() |
76 |
| -memoryview.__repr__ = lambda self: self.__c_memoryview.__repr__() |
77 |
| -memoryview.__len__ = lambda self: self.__c_memoryview.__len__() |
78 |
| -memoryview.__getitem__ = make_getitem() |
79 |
| -memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value) |
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 | 71 |
|
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") |
| 72 | +for p in ["__repr__", "__len__", "release", "tobytes", "hex", "tolist", |
| 73 | + "__enter__", "__exit__"]: |
| 74 | + setattr(memoryview, p, lambda self: getattr(self.__c_memoryview, p)()) |
100 | 75 |
|
101 | 76 |
|
102 |
| -del make_init |
103 |
| -del make_getitem |
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 |
| 77 | +# other delegate methods |
| 78 | +memoryview.__init__ = __memoryview_init |
| 79 | +memoryview.__getitem__ = __memoryview_getitem |
| 80 | +memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value) |
| 81 | +memoryview.cast = lambda self, *args: self.__c_memoryview.cast(*args) |
0 commit comments