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

2024-04-29 11:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在“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

回来后我不能做任何事情,有什么想法吗


Tags: 函数runselfreportid表单报告hr
1条回答
网友
1楼 · 发布于 2024-04-29 11:29:00

假设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.employee_id.id, indicador_id, self.id)
    try:
        return payslip.print_nominee_report()
    finally:
        payslip.cleanup_function()
    

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


更新:原始代码中的report似乎对payslip对象有一个活动的依赖关系,因此在调用方处理完报告之前,您无法实际清理payslip。如果是这样,您还有两个选择:

  1. 找出如何删除活动依赖项,以便report是一组独立的数据(取决于您没有向我们展示的代码,但这是最好的解决方案,如果可能的话)

  2. 使用绑定到report的终结器,该终结器将保留payslip,直到report被垃圾回收,此时它将清理它,la:

    # 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.employee_id.id, indicador_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
    

    这个选项并不完美;即使在具有确定性引用计数的CPython上,如果涉及引用循环,即使使用了report,调用循环收集器和report实际收集(以及调用清除函数)之前也可能需要任意时间。在具有真正垃圾收集器的非CPython解释器上,即使没有引用周期,也会发生这种情况

相关问题 更多 >