Debug and Release Build Strategy for Python Projects
我有一个软件(2100 SLOC),我考虑在两个不同的版本中运行:一个版本向控制台提供详细的调试信息,另一个版本是优化的发布版本。
我的目标是要有一个单独的git分支来维护。有没有一种方法可以标记代码的调试部分并向Python解释器发出信号,以忽略代码的这些部分?
可能的应用程序包括:打印语句、python的日志记录功能、分析和断言[编辑:通过设置-O标志,这些显然被忽略了]。
- 你在哪里读到装饰工是不好的做法?您是否考虑在两个不同的环境中简单地设置不同的日志输出级别,并且只使用logging而不是print?在调用python时,您可以使用-O排除您可能拥有的任何assert离子。
- @我在这里读到过装饰师。我不熟悉解释器如何处理日志记录。
- 这就是为什么您不使用它将每个函数标记为可调试的原因,不清楚为什么您认为它与这里相关。
- @乔恩沙普,这是我关于这句话的可概括性的一个思想错误。我已经更新了这个问题。
- 我发现这在创建我的第一个大型python项目时很有用:jeffknupp.com/blog/2013/08/16/…
我认为你把这件事弄得太复杂了。理想情况下,对于开发和生产环境,您不应该有不同的代码路径,而应该只有不同的配置,否则,很难确定测试是否实际反映了部署时代码的行为。像分析和调试代码这样的事情应该在这个过程之外,在代码库而不是代码库的一部分上运行。
如果您只关心日志记录,只需在不同的环境中设置不同的输出级别。假设您有一个标准的库日志记录设置,您可以执行如下操作:
1 2 3 4 5 6 7
| import logging
import os
logging.basicConfig(
level=getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG')),
...
) |
在您的入口点,这样您就可以在生产环境中设置一个显式的LOG_LEVEL环境变量(允许值之一),并默认为DEBUG进行开发。或者,将默认值设为生产级别(例如,ERROR)并在开发环境中明确设置它。然后应该只通过logging输出消息,而不使用print。
您还应该让记录器处理任何字符串插值,即使用:
1
| logger.info('hello %s', 'world') |
而不是:
1
| logger.info('hello %s' % 'world') # or logger.info('hello {}'.format('world')) |
因此,如果日志记录级别没有激活,它可以为您优化插值。
- 我期待着重构我的项目,并在我的IDE中建立一个额外的-O运行参数。我唯一剩下的担心是,是否在-O模式下调用isEnabledFor。
- @本体,除非你做的是计算上昂贵的事情只是为了记录(在这种情况下,重新考虑你是否真的需要它们),否则你根本不需要调用它。但不,-O不会删除该调用。
- 我刚开始进行单元测试,但这可能是处理计算上昂贵的"日志记录"的更好方法,例如使用假设。
- @本体用于测试,而不是日志记录,因此根本不应该是部署代码的一部分。通常,测试在包本身的单独目录中,并且您只部署包(测试全部通过之后)。就生产性能而言,测试完成的日志记录/输出是不相关的。
我在这里找到了一个答案:
1 2
| if __debug__:
doSomething() |
要将__debug__设置为false要求运行带有标志-O或-OO的python。