2015-06-11 23 views
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.pyb.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標準?

+1

我會遵循PEP20: _雖然實用性勝過純度._ – user3557327

+0

PEP8在哪裏說這是不允許的? –

+0

@SimeonVisser實際上,pylint在說'W0611'是'已導入但未使用'。我認爲這是一個PEP8的事情,但也許它不是= /我用python模式使用vim,這是我從fwiw得到的錯誤。 –

回答

1

你可以在你的開始調用這個函數啓用和禁用日誌功能,動態加載模塊,但我覺得周圍的PEP這種方式,可以作弊越來越:

import glob 
import imp 
import os 

def load_modules(module_names=None): 
    if module_names is None: 
     cur_dir = os.path.realpath(os.path.dirname(__file__)) 
     module_wc = '{}/*.py'.format(cur_dir) 
     module_names = [mn for mn in glob.glob(module_wc) if not mn.startswith('_')] 
    modules = map(imp.load_source, module_names) 
    return modules