【发布时间】: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确实可以在检查之间更改。
标签: python metaprogramming decorator python-decorators self-modifying