Вы можете попробовать создать генератор-обертку, который по окончании работы не будет иметь ссылки на внутренний генератор.Следующее может даже сделать это (полностью не проверено):
def strange(gen):
for thing in gen:
yield thing
Как только gen
поднимает StopIteration
, генератор strange
выйдет из цикла for, а затем вернет None
, что снова повысит StopIteration
.Если gen
была последней ссылкой на генератор, она должна быть / может быть доступна для сборки мусора до того, как какой-либо итеративный код по strange(gen)
вернет управление.На CPython это означало бы, что он освобожден.
Обратите внимание, что это не поможет, если вы сделаете что-то вроде следующего:
g = some_generator()
for x in strange(g):
do_something()
Поскольку g
сама по себе является ссылкой на внутреннийгенератор.Вам придется использовать его более примерно так:
for x in strange(some_generator()):
do_something()
Но на самом деле самый простой способ - делать то, что вы делаете с любым другим объектом, когда вы не хотите, чтобы он зависал в памяти:убедитесь, что вы не держитесь за ссылку на него.Если переменная, ссылающаяся на нее, находилась в долгоживущей области видимости, вы можете явно del
it.