次のコードは非常に単純ですが、何らかの理由でforループがロガーのすべてのハンドラを反復処理しません。しかし、else節にmy_logger.removeHandler(ハンドラ)を削除すると、for-loopはすべてのハンドラを反復処理します。私は何か悪いことをしている場合、任意のアイデア?Python 2.7.2がロガーのハンドラを正しく反復しない
import logging
import sys
stdf = logging.Formatter("%(message)s")
filef = logging.Formatter("%(message)s")
my_logger = logging.getLogger("file std logger")
stdh = logging.StreamHandler(sys.stdout)
stdh.setFormatter(stdf)
my_logger.addHandler(stdh)
fileh = logging.FileHandler("run.log", mode = 'w', encoding = "utf-16-le", delay = True)
fileh.setLevel(logging.DEBUG)
fileh.setFormatter(filef)
my_logger.addHandler(fileh)
my_logger.info("wow1")
my_logger.info("test string1")
my_logger.info("wow2")
my_logger.info("test string2")
my_logger.info("wow3")
my_logger.info("test string3")
for handler in my_logger.handlers:
print(handler)
if handler.__class__.__name__ == "FileHandler":
handler.flush()
handler.close()
my_logger.removeHandler(handler)
else:
handler.flush()
my_logger.removeHandler(handler)
my_logger.handlers
私はイテレータを開始した時点でイテレータがすべての要素を反復すると思っていました。つまり、「Pythonのfor-loopはC/C++と同じです」というチュートリアルは間違っています...これは、反復中のリストの変更が危険であることを意味します。これは、C/C++では配列ポインタを削除せずに配列ポインタが指す内容のみを削除するため、C/C++とは異なります。これを指摘してくれてありがとう。 – SCM