是否可以在“return”语句后删除记录?

问题描述

我在 'hr.contract' 中做了一个函数生成工资单。但是这个工资单是用来模拟和计算一些工资的,所以在创建工资单后我必须删除它。

此外,我还制作了一个功能,可以从合同表格中打印工资单报告。问题是,当我点击“打印”按钮时,我创建了工资单并返回了它的报告,但是我想不出删除创建的工资单的方法

def generate_report(self):
        # I get this values from another methods,# I put 1 and 20 just to avoid confution in the question.
        run_id = 1
        indicador_id = 20

        payslip = self.generate_fake_nominee(run_id,self.employee_id.id,indicador_id,self.id)

        report = payslip.print_nominee_report()
        return report

回来后我不能做事,所以有什么想法吗?

解决方法

假设 payslip 是唯一的引用,当函数返回时应该将其删除。如果它持有可能无法正确清理的资源,则:

  1. 它应该实现上下文管理协议,并且可以使用 with 语句:

    with self.generate_fake_nominee(run_id,self.employee_id.id,indicador_id,self.id) as payslip:
        return payslip.print_nominee_report()
    

    或者,

  2. 如果你需要手动调用一些清理函数,可以使用 finally 块:

    payslip = self.generate_fake_nominee(run_id,self.id)
    try:
        return payslip.print_nominee_report()
    finally:
        payslip.cleanup_function()
    

明确地说,将 del payslip 放在 finally 块中是完全没有意义的;无论如何,当函数返回时,名称将是未绑定的,因此 del 什么也不做。绑定到 payslip 的对象无论如何都会被释放(如果它没有其他别名),或者无论如何它都不会被释放(它在别处被别名)。当函数无论如何返回时,payslip 都是未绑定的,而 del 所做的只是使解除绑定显式,这会更慢且冗长无意义。


更新:您原始代码中的 report 似乎对 payslip 对象具有实时依赖关系,因此您实际上无法清除 {{1} }} 直到调用者完成报告。如果是这种情况,您也有两个选择:

  1. 找出如何删除实时依赖项,因此 payslip 是一组独立的数据(取决于您尚未向我们展示的代码,但如果可能,这是最好的解决方案)

  2. 使用绑定到 report 的终结器,它会保留 report 直到 payslip 被垃圾收集,然后它会清理它,就像:

    report

    这个选项并不完美;即使在具有确定性引用计数的 CPython 上,如果涉及引用循环,即使您完成了 # At top of module import weakref def generate_report(self): # I get this values from another methods,# I put 1 and 20 just to avoid confution in the question. run_id = 1 indicador_id = 20 payslip = self.generate_fake_nominee(run_id,self.id) report = payslip.print_nominee_report() # Ensure cleanup_function is called when report is gc-ed weakref.finalize(report,payslip.cleanup_function) return report ,在调用循环收集器并实际收集 report 之前可能需要任意时间(以及调用的清理函数)。在具有真正垃圾收集器的非 CPython 解释器上,即使没有引用循环也会发生这种情况。