5

PEP 8建议在程序开始时导入模块。

现在,我觉得在主程序的开头(即 after if __name__ == '__main__')导入其中的一些是有意义的。例如,如果主程序从命令行读取参数,我倾向于在主程序import sys的开头做:这样,当代码用作模块时,不必导入,因为不需要,在这种情况下,用于命令行参数访问。sys

这种对 PEP 8 的侵犯有多严重?我应该避免这样做吗?还是修改 PEP 8 是否合理?

4

5 回答 5

9

我真的不能告诉你这样做有多糟糕。

但是,通过仅在第一次使用时导入某些库,我极大地提高了 Web 应用程序的性能(响应时间、负载)。

顺便说一句,以下内容也来自 PEP 8:

但最重要的是:知道何时不一致——有时风格指南并不适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。不要犹豫,问!

于 2009-10-14T09:23:03.290 回答
6

一般来说,我认为后期导入可能不需要的模块并没有太大的危害。

但是sys,我肯定会尽早导入,在顶部。这是一个非常常见的模块,您很可能会在脚本的其他地方使用 sys 而不会注意到它并不总是被导入。sys也是总是由 Python 本身加载的模块之一,因此您不会通过避免导入来节省任何模块启动时间(无论如何,sys 的启动并不多)。

于 2009-10-14T09:45:14.537 回答
2

当 PEP 中没有任何关于您的担忧时,我会建议您做您认为最合适的事情。

于 2009-10-14T09:23:54.350 回答
2

导入 sys 并不需要那么长时间,我会担心它。但是,某些模块确实需要更长的时间。我认为 sys 并没有真正阻塞命名空间。无论如何,我都不会使用名为 sys 的变量或类。

如果您认为将其置于顶部弊大于利,那么无论如何都可以随心所欲地去做。PEP 8 只是一个指导方针,您看到的许多代码并不符合它。

于 2009-10-14T09:43:17.213 回答
2

问题不在于性能。

问题是清晰度。

您的“主”程序今天只是一个主程序。明天,它可能是某个更高级别的主程序中包含的库。稍后,它将只是更大包装中的一个模块。

由于您的“主要”程序的生命可能会改变,因此您有两个响应。

  1. 隔离里面的“主要”东西if __name__ == "__main__"。这不是对 PEP-8 的荒谬违反。这是一种合理的打包方式。

  2. 尝试限制“主”程序脚本中的功能数量。尝试将它们降低到imports 和其他if __name__ == "__main__"东西。如果您的主脚本很小,那么您的导入问题就会消失。

于 2009-10-14T12:07:10.757 回答