python - 破译Python中的大型程序流程

标签 python program-flow

我正在学习如何设置一个大型(356 个文件)、复杂的 Python 程序。除了手动阅读和解析代码之外,还有什么好的方法可以跟踪程序流程吗?

我认为有两种有用的方法:

  1. 类似于 Bash 的“set -x”
  2. 显示哪个文件输出每一行输出

是否有任何方法可以执行上述操作,或者您发现有用的任何其他方法?

最佳答案

我不知道这实际上是不是一个好主意,但由于我实际上编写了一个钩子(Hook)来在输出到 stdout 的每行​​之前显示文件和行,所以我不妨将它给你......

import inspect, sys

class WrapStdout(object):
    _stdout = sys.stdout
    def write(self, buf):
        frame = sys._getframe(1)
        try:
            f = inspect.getsourcefile(frame)
        except TypeError:
            f = 'unknown'
        l = frame.f_lineno
        self._stdout.write('{}:{}:{}'.format(f, l, buf))
    def flush(self):
        self._stdout.flush()

sys.stdout = WrapStdout()

只需将其保存为模块,然后导入它后,标准输出的每个 block 都会以文件和行号为前缀。

当然,如果出现以下情况,这会变得非常难看:

  • 任何人尝试打印部分行(直接使用 stdout.write,或在 2.x 中使用 print 魔术逗号,或 end='' 在 3.x 中)。
  • 您在 2.x 中混合了 Unicode 和非 Unicode。
  • 任何源文件都具有长路径名。
  • 等等

但是所有棘手的深度 Python 魔法位都在那里;您可以非常轻松地在其基础上进行构建。

关于python - 破译Python中的大型程序流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914919/

相关文章:

python - 使用重复的索引 reshape Pandas Dataframe 并填充缺失的行

python - 在 sqlite 数据库中使用 sqlalchemy 按顺序生成用户 ID。

c# - 正确处理文件流和二进制流以及处理文件流

go - 在 Golang 中推迟延期

c++ - 我如何从 void 中退出我当前的范围,以便我可以回到 main?我需要做什么?

python - 如何在 Windows cmd 上打印不支持的 unicode 字符,例如 "?"而不是引发异常?

Python 名称错误 : name 'ctypes' is not defined

function - 在没有 if-else/switch-case 语句的情况下控制程序流

java - 将对象设置为null以及Java中的程序流程

python - 如何迭代数据帧行,以更Pythonic的方式替换匹配元组中的值?