あなたが望むものを達成するために拡張できるシンプルで素朴なソリューション:
WRITABLE_DIRECTORY = '/full/path/to/writable/directory'
class MaxSizeFile(object):
def __init__(self, fobj, max_bytes=float('+inf')):
self._fobj = fobj
self._max = max_bytes
self._cur = 0
def write(self, data):
# should take into account file position...
if self._cur + len(data) > self._max:
raise IOError('The file is too big!')
self._fobj.write(data)
self._cur += len(data)
def __getattr__(self, attr):
return getattr(self._fobj, attr)
def my_open(filename, mode='r', ..., max_size=float('+inf')):
if '+' in mode or 'w' in mode:
if os.path.dirname(filename) != WRITABLE_DIRECTORY:
raise OSError('Cannot write outside the writable directory.')
return MaxSizeFile(open(filename, mode, ...), max_size)
次に、代わりにビルトインを使用してopen
を呼び出しますmy_open
。配列に対しても同じことができます。配列を直接割り当てる代わりに、割り当てられたメモリの量を追跡し、最終的に例外を発生させる関数を呼び出します。
明らかに、これは非常に軽い制約しか与えませんが、プログラムが問題を引き起こすことを目的として書かれていない場合は、それで十分なはずです。