答案 0 :(得分:1)
正如评论中所提到的,在this answer中已经讨论过从Python生成UML。 (请记住,Python实际上不必是UML可表示的 - 但如果它是,那很好。)
至于在运行时看到控制流,有几种方法可以做到这一点。一种是使用分析和/或调试工具。但是让我们看看记录它的最简单的方法,这就是你要求的:
只需print
进入控制台即可随时“记录”任何内容。您必须从命令行运行应用程序而不是启动GUI样式(在Mac上,这意味着您必须直接运行可执行文件/脚本,而不是任何由其构建的.app
包。 ),但是你已经获得了日志输出 - 你可以使用你的shell(甚至是Windows cmd
)将它重定向到一个文件,以便以后浏览,如果你愿意的话。如果这对您来说不够好,请参阅标准库中内置的logging
模块。
如果您想知道调用函数的位置,可以在每次调用函数时记录堆栈跟踪。这有点难看,但它提供了您可能想要的所有信息,您可以随时编写一些代码来解析输出。函数traceback.print_stack正是这样做的。 (如果你想获得更多的花哨,可以使用其他功能来提取信息,根据需要进行格式化,并按照你想要的方式记录。)
您可以通过将此行添加到要跟踪的每个函数来实现:
traceback.print_stack()
另一种方法是编写一个猴子修补程序并将其应用于您关心的所有函数:
def tracify(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
traceback.print_stack()
func(*args, **kwargs)
return wrapper
现在,在主脚本中,只需执行此操作:
InterestingClass.interestingMethod = tracify(InterestingClass.interestingMethod)
现在,每次调用InterestingClass.interestingMethod时,它都会打印出堆栈跟踪。您无需了解tracify
的工作原理。如果你想改变它对函数的作用,只需将行traceback.print_stack()
替换为你想做的任何事情。
那么,如果你想修补一个类中的每个“公共”方法怎么办?
for attr in dir(InterestingClass):
if not attr.startswith('_'):
method = getattr(InterestingClass, attr)
if isinstance(method, instancemethod):
setattr(InterestingClass, tracify(method))
(这是针对Python 2. Python 3改变了一些事情,使得复杂的案例变得更加简单,但是琐碎的案例并不是那么简单。)
如果要修补模块中每个类和每个自由函数的每个公共方法,该怎么办?您可以以相同的方式迭代模块,并检查每个事物的类型,就像使用类一样。
你也可以使用inspect模块为你做一些艰难的事情。但是,如果您只是在学习Python,我认为复制和粘贴dir
代码要比学习如何使用inspect
简单得多。一旦你对这门语言更加熟悉,请回来和inspect
一起玩,找出它为什么起作用。
答案 1 :(得分:0)
我不使用Python,但是当你想要实时跟踪程序正在做什么时,你会使用调试器,并且为Python调试器进行一些谷歌搜索可能会给你一些有希望的结果。