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()。任何帮助将不胜感激!
答案 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
我会将其留给读者练习。