3
我有這種結構的包:PEP8兼容的方式來切換記錄了整個包
mypackage
|
+---- a.py
+---- b.py
+---- __init__.py
這個包有時被用作圖書館,有時交互與IPython的,所以我需要配置日誌不同在這兩種情況下:
- 交互:在控制檯打印日誌,所以記錄儀應該有一個
StreamHandler
處理 - 庫:讓用戶配置記錄,所以記錄儀應該有一個
NullHandler
處理
在__init__.py
我這樣做:
import logging
import a
import b
logging.getLogger(__name__).addHandler(logging.NullHandler())
def get_loggers():
"""
Get all the logger objects instantiated for the current package
"""
loggers = []
for logger in logging.Logger.manager.loggerDict.values():
if not isinstance(logger, logging.Logger):
continue
if logger.name.startswith(__name__):
loggers.append(logger)
return loggers
def enable_logs():
"""
Configure loggers to print on stdout/stderr
"""
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(
'%(name)s :: %(levelname)s :: %(message)s'))
for logger in get_loggers():
logger.removeHandler(handler)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.propagate = False
def disable_logs():
"""
Configure loggers not to print anywhere
"""
handler = logging.NullHandler()
for logger in get_loggers():
logger.removeHandler(handler)
logger.addHandler(handler)
logger.propagate = False
a.py
和b.py
都開始:
import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())
所以,現在我可以這樣做,啓用/禁用日誌記錄:
import mypackage
mypackage.enable_logs()
mypackage.disable_logs()
但這種解決方案不符合PEP8
,因爲在__init__.py
中我導入了未使用的模塊。請注意,不必導入它們,但是我想要,因爲在導入包時會創建它們各自的記錄器。
問題1:他們是否符合PEP8標準實現相同目標?
問題2:這可能是主觀性的,在這種情況下是否符合PEP8標準?
我會遵循PEP20: _雖然實用性勝過純度._ – user3557327
PEP8在哪裏說這是不允許的? –
@SimeonVisser實際上,pylint在說'W0611'是'已導入但未使用'。我認爲這是一個PEP8的事情,但也許它不是= /我用python模式使用vim,這是我從fwiw得到的錯誤。 –