我希望您能提供与以下内容等价的翻译:
calling method: $METHOD_NAME
args: $ARGS
output: $OUTPUT
希望能够对每个(用户定义的)方法调用进行自动记录(可能通过logging
模块记录到文件中)。我能想到的最好的解决方案是编写一个装饰器来完成这个功能,然后将其添加到每个函数中。是否有更好的方法?
谢谢
import sys
import trace
# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
ignoredirs=[sys.prefix, sys.exec_prefix],
trace=0,
count=1)
# run the new command using the given tracer
tracer.run('main()')
# make a report, placing output in /tmp
r = tracer.results()
r.write_results(show_missing=True, coverdir="/tmp")
一种可能简化事情的方法是使用元类自动应用您的装饰器。这样可以减少输入,但需要深入了解晦涩而神秘的元类编程世界。
这取决于你将如何使用它。 最通用的方法是遵循stdlib的“profile”模块路径,从而对每个调用进行控制,但速度有点慢。
如果您知道在控制之前需要跟踪哪些模块,则可以迭代所有成员并使用跟踪装饰器进行包装。这样跟踪代码保持清洁,并且实现不需要太多编码。
对于较小的项目,装饰器可能是一种简单的方法,但是使用装饰器时必须小心传递参数,以确保它们不会在传递过程中被搞乱。元类可能更符合“正确”的方式,而无需担心为每个新方法添加装饰器。