python - 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!
我不知道在解决方案()函数中放入什么来禁用静音()。任何帮助将不胜感激!
解决方案
评论中的说明很清楚,但“禁用”的定义却不是。我真的不应该对此发布答案,但是我刚刚学到了很多东西并且无法抗拒。
第一步是设置一个跟踪功能,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
我将把它作为练习留给读者。
推荐阅读
- influxdb - 涌入数据库。中断查询的条件
- encryption - 解析 EC 公钥
- javascript - 如何在 Javascript 条形图中传递 JSON 数据?
- javascript - 如何使用 laravel 和 jquery 在数据表中添加行跨度
- amazon-web-services - 我是否可以在不拥有域的情况下在 AWS 提供的 ALB 子域上设置 SSL?
- google-sheets - 从一个单元格中查找多个值
- excel - 使用 MS excel 文件中的 URL 链接下载多个图像
- database - db关闭时如何处理flyway
- python - 正则表达式在标记之间拾取文本并包含最后一个标记
- javascript - 如何将两个API响应数组合并到一个数组中并返回数据Angular 8