我试图了解如何在文件上下文管理器中调用__enter__
和__exit__
方法。
with open("test.txt") as fp:
fp.read()
我在pdb中尝试了step
命令 - 而不是定义函数open
,它只是执行它并继续前进到下一行。
我也尝试使用sys.settrace()
,但即使它没有捕获任何事件中的函数调用open
,__enter__
和__exit__
。
当然,这适用于从其他模块和同一模块导入的函数。我假设这应该以类似的方式开箱即用这些内置函数。我找不到任何指向此的文档。是否有可能进入或跟踪内置函数的执行?
使用Python 2.7。
答案 0 :(得分:3)
在跟踪内置函数时,尝试使用sys.setprofile代替sys.settrace:
系统的配置文件函数的调用方式与系统的跟踪功能类似(请参阅settrace()),但是会使用不同的事件来调用,例如,不会为每一行已执行的代码调用它(仅在调用和返回时,但即使设置了异常,也会报告返回事件)
除了事件“ call”和“ return”之外,setprofile
还提供了“ c_call”和“ c_return”,它们表示从内置函数进行调用和返回。
请注意其他两个参数frame
和arg
的含义有所改变:
如果event
等于“ c_call”或“ c_return”,则frame
是调用内置函数的外部框架,因此frame.f_code.co_name
不是内置函数的名称,而是名称调用它的python函数。
相反,arg
是C函数对象,而不是返回值。
所以回答您的问题:
是否可以介入或跟踪内置函数的执行?
是的,可以跟踪内置函数的调用/返回,但是,您不能单步执行。我猜您之所以在调试器中什至看不到c_call / c_return的原因是因为它使用的是settrace而不是setprofile。