автоматически регистрировать функцию очистки при выходе из области действия функции - PullRequest
0 голосов
/ 12 октября 2018

У меня есть функция, которая принимает коллекцию объектов в качестве аргумента.В случае, если я получаю доступ к члену коллекции, я хочу вызвать функцию очистки этого члена в конце этого вызова этой функции (в основном, отправить его обратно в redis, когда функция завершит мутированиеобъект)

так, например:

class foo():
  value = 0
  clean = True

  def modify(self):
    self.value +=1
    self.clean = False

  def cleanup(self):
    if not self.clean:
      # do cleanup stuff (i.e. send dirtied data back to database)
      print("foo cleanup " + str(self.value))
      self.clean = True


def calling_function(collection):
  try:
    collection[1].modify()
  #... do other stuff
  finally:
    for f in collection:
      f.cleanup()


col = [foo(), foo()]

calling_function(col)

Я бы хотел выполнить эту функцию без блока try / finally.Идея состоит в том, что функция, использующая коллекцию, должна быть независимой от необходимости очищать ее, она должна просто иметь возможность доступа к ней и автоматически сохранять данные, когда они выпадают из области видимости (правка: она не выпадает из области видимости, потому чтов вызывающей области все еще есть ссылка)

Единственная идея, которая у меня была, заключалась в том, чтобы каким-то образом внедрить объект в текущую (функциональную) область видимости, который del сделает то, что мне нужно.Но это кажется грязным, и я даже не знаю, возможно ли это.

...