首页 > 解决方案 > Python3-我应该如何创建一个可以禁用嵌套函数的函数?

问题描述

Python新手在这里。我正在尝试创建一个可以跟踪其他功能的功能。它还需要禁用嵌套函数silence() 并继续运行其余函数:

import dis
import inspect
import sys

def foo():
    global print
    print('Entering foo()...')  

    #unsilence (disable) this function
    def silence(*args):
        pass
    print = silence

    print('silence() has been disabled, congratulations!')

def solution():
    #you can only code here
    #use sys.settrace and inspect
    pass

def main():
    print('Start!')
    solution()
    foo()

if __name__ == '__main__':
    main()

它应该输出:

Start!
Entering foo()...
silence() has been disabled, congratulations!

我不知道在解决方案()函数中放入什么来禁用静音()。任何帮助将不胜感激!

标签: pythonpython-3.x

解决方案


评论中的说明很清楚,但“禁用”的定义却不是。我真的不应该对此发布答案,但是我刚刚学到了很多东西并且无法抗拒。

第一步是设置一个跟踪功能,sys.settrace这将允许您检查和拦截正在执行的指令。一旦你有了它,你就可以检测到全局print函数的赋值并拦截它。在下面的示例中,我通过行号完成了它。这显然不是很健壮,但应该让你开始:

def solution():
    #you can only code here
    myprint = print
    def mytrace(frame, event, arg):
        if frame.f_lineno == 14:
            frame.f_globals['print'] = myprint
        return mytrace
    sys.settrace(mytrace)

更好的解决方案可能是检查

if frame.f_globals['print'] is not myprint:

一个更复杂的替代方法可能是截取以 开头的行def silence,并将函数的代码块替换为读取的函数的代码块

print(*args)  # being careful to refer to the original print and not the replacement

我将把它作为练习留给读者。


推荐阅读