Я пишу функцию, которая принимает огромный аргумент и работает в течение длительного времени. Для этого аргумент нужен только наполовину. Есть ли способ для функции удалить значение, на которое указывает аргумент, если больше нет ссылок на него?Как удалить аргумент функции раньше?
Я был в состоянии получить его удален, как только функция возвращает, например:
def f(m):
print 'S1'
m = None
#__import__('gc').collect() # Uncommenting this doesn't help.
print 'S2'
class M(object):
def __del__(self):
print '__del__'
f(M())
Это печатает:
S1
S2
__del__
мне нужно:
S1
__del__
S2
Я был также пытается def f(*args):
и def f(**kwargs)
, но это не помогло, я до сих пор получаю __del__
последний.
Обратите внимание, что мой код полагается на то, что Python имеет подсчет ссылок, а __del__
вызывается, как только счетчик ссылок объекта падает до нуля. Я хочу, чтобы счетчик ссылок аргумента функции упал до нуля в середине функции. Это возможно?
Пожалуйста, обратите внимание, что я знаю, что обходной путь: передавая список аргументов:
def f(ms):
print 'S1'
del ms[:]
print 'S2'
class M(object):
def __del__(self):
print '__del__'
f([M()])
Печатается:
S1
__del__
S2
Есть ли способ, чтобы получить раннее удаление без изменения API (например, ввод списков в аргументы)?
Если трудно получить портативное решение, которое работает во многих реализациях Python, мне нужно что-то, что работает в самом последнем CPython 2.7. Его не нужно документировать.
Почему вы хотите это сделать? Вообще-то я думаю, что python не будет мусора собирать что-то, как только он ссылается на количество обращений 0, но только некоторое (не определенное) время после. Вы должны иметь возможность принудительно собирать мусор. – syntonym
Аргумент передается из области вызова. В конечном итоге объект все еще упоминается там.Однако при низком уровне вы снижаете количество ссылок в вашей функции, пока ваша функция не закончит объект, вероятно, не будет собран мусор, потому что ссылки на область действия родителя еще не очищены. - Это в значительной степени просто предположение, но я не знаю, как поведение будет отличаться между 'foo (m)' и 'foo (M())'; логика диктует, что он не должен * отличаться, но это зависит от реализации. – deceze
Я * хочу * сказать, что даже если вы отвязаете аргумент, он все еще существует вне области действия. –