This is just an experiment to test my mental understanding of Python. It should not be used in any code as is violates the design principle that floats are to be immutable. The code also abuses ctypes
and an understanding of how floats
are currently arranged in memory. set_float
is not guaranteed to work properly on any system, and may fail to work in the future if the data's arrangement changes.
1 2 3 4 5 6 7 8 9 10 | import sys, struct, ctypes
def set_float(obj, value):
assert isinstance(obj, float), 'Object must be a float!'
assert isinstance(value, float), 'Value must be a float!'
stop = sys.getsizeof(obj)
start = stop - struct.calcsize('d')
array = ctypes.cast(id(obj), ctypes.POINTER(ctypes.c_ubyte))
for args in zip(range(start, stop), struct.pack('d', value)):
array.__setitem__(*args)
|
The following is a simple demonstration of how the set_float
function could be used. Its implementation was meant as a test of understanding how both ctypes
and Python work.
>>> a = 1.2
>>> set_float(a, 3.4)
>>> a
3.4