我在python 3中使用logging
库。我想在我的代码中使用logging.handlers.RotatingFileHandler
,logging.Formatter
和logging.getLogger
。
我观察到的是跟随(忽略函数的参数)没有任何错误:
import logging.handlers
log_formatter = logging.Formatter()
log_handler = logging.handlers.RotatingFileHandler()
logger = logging.getLogger()
在这种情况下,我是否还应单独导入logging
?
另外,导入子模块总是导入Python中父模块的所有引用吗?
答案 0 :(得分:1)
通常,导入模块会导入其所有父项,并且不会导入其任何子模块。如果你用纯Python实现所有东西,并且不做任何有趣的事情,那就是它的工作原理。
但扩展模块的工作方式可能不同。 (例如,如果您import os
,则会获得os.path
。)
纯Python代码可以做一些时髦的事情 - 例如,您可以编写一个动态构建软件包的顶级模块,而不是磁盘上的真实软件包布局,在这种情况下,用户将拥有至少import
顶层模块(并且可能会或可能不会免费获取子模块)。
始终安全地明确import
您将要直接使用的所有内容。这样做并没有真正的伤害 - 一个额外的代码行,导入器看到该模块已经在dict中并且什么也不做,只需要几纳秒就可以了。
同时,对于人类读者而言,以及一个实际上并没有import
的IDE也很清楚。当您致电logging.getLogger
时,我可以看到您执行了import logger
,因此我知道logging
是一个模块,而不是其他全局模块。
但如果你真的想,你可以了解每个特定包的工作原理并使用这些知识。走向这个方向很难在实践中混淆。而且,即使是相反的方向,很多真实世界的代码依赖于import os
给你os.path
。
在logging
的特定情况下,我相信文档中的教程和食谱中的所有示例都明确地import logging
,所以如果你问的是最惯用的是什么,可能就是这样。