有没有办法在 Python 函数的每一行上装饰/执行操作?

Posted

技术标签:

【中文标题】有没有办法在 Python 函数的每一行上装饰/执行操作?【英文标题】:Is there a way to decorate/perform operations on every line of a function in Python? 【发布时间】:2012-10-23 07:46:35 【问题描述】:

假设我有一个函数或方法在执行它所做的每个操作之前执行重复的操作,例如检查值,如下所示:

def myfunc():
    if mybool:
        do_operation_1()
    else:
        return

    if mybool:
        do_operation_2()
    else:
        return

    ...

这些检查会重复进行,最终会浪费大量时间和键盘弹簧,尤其是在经常需要它们时。

如果你可以控制操作函数,比如do_operation_N,你可以用检查布尔值的东西来装饰函数。

但是,如果您无法控制单个 do_operation_N 操作怎么办?如果,对于函数或方法中的每一行,我希望执行相同的检查,是否有某种方法可以“插入”它而不在每个操作行上明确写入?例如,是否有一些装饰魔法可以让我执行以下操作?

def magic_decorator(to_decorate):
    def check(*args, **kwargs):
        for call in to_decorate: #magic
            if mybool:
                to_decorate.do_call(call) #magic
            else:
                return #or break, raise an exception, etc
    return check

@magic_decorator
def myfunc():
    do_operation_1()
    do_operation_2()
    ...

如果有办法实现这一点,我不在乎它是否使用装饰器;我只想用某种方式说“对于函数/方法 X 中的每一行,先做 Y”。

上面do_call 方法的“神奇”示例是我所追求的简写,但它会遇到各个行的乱序执行的严重问题(例如,如果函数的第一行是一个变量赋值,第二个是对该变量的使用,无序执行它们会导致问题)。

要明确:外部控制函数执行的逐行顺序的能力不是我想要实现的:理想情况下,我只是实现一些东西,在自然执行顺序中,每次myfunc 做某事时都会执行一个操作。如果“做某事”最终仅限于“调用函数或方法”(不包括分配、if 检查等),那很好。

【问题讨论】:

除非您过于简化并且mybool 可以在两者之间进行更改(甚至取决于线路),否则您可以简单地对myfunc 进行有条件的调用。我想这不是那么简单,所以你能澄清一下吗? 我的目标是,给定一个检查(如mybool)和一个任意的、可能很长的函数/方法,以应用条件/检查而不手动使每个条件函数中的操作。我不是最擅长表达这些事情,所以请编辑/建议编辑以使我的目标更清晰。 我不清楚的是条件是否始终相同并适用于所有行。如果是这样,您可以通过不处理单个行来显着简化它(只需调用/不调用整个函数)。 mybool 确实可以在检查之间更改。 【参考方案1】:

按顺序存储您的操作,然后使用循环:

ops = (do_operation_1, do_operation_2, do_operation_3)

for op in ops:
    if mybool:
        op()
    else:
        return

【讨论】:

all((my_bool and op() or my_bool for op in ops)) @Liso:为什么是or my_bool 如果 op() 返回None(例如没有return)或False 这使得它相当笨重且难以阅读,你不觉得吗?【参考方案2】:

本质上,您可以从修饰函数中提取文件和行号,重新读取函数,将其编译为 AST,在 AST 中插入节点,然后编译 AST 并将其用作函数。

这种方法可以用于很长的函数,如果你使用上面的方法,这是一个问题。

【讨论】:

以上是关于有没有办法在 Python 函数的每一行上装饰/执行操作?的主要内容,如果未能解决你的问题,请参考以下文章

python中装饰器修复技术

Python中装饰器的用法

用于打印函数执行的每一行的 Python 装饰器

缓慢的 MySQL 查询:有没有办法避免对左连接的每一行进行条件选择计数?

Python3中装饰器介绍

对Python中装饰器(Decorator)的理解与进阶