Python3-如何创建可以禁用嵌套函数的函数?

时间:2018-07-24 04:39:35

标签: python python-3.x

Python newb在这里。我正在尝试创建一个可以跟踪其他功能的功能。它还需要禁用嵌套函数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!

我不知道要在solution()函数中放入什么来禁用silence()。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

注释中的指令非常清楚,但是“ disable”的定义不是。我确实不应该对此发表答案,但是我现在学到了很多,并且无法抗拒。

第一步是使用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

我会将其留给读者练习。