Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Python 2.7.2没有';t正确迭代记录器';s处理程序_Logging_Python 2.7 - Fatal编程技术网

Logging Python 2.7.2没有';t正确迭代记录器';s处理程序

Logging Python 2.7.2没有';t正确迭代记录器';s处理程序,logging,python-2.7,Logging,Python 2.7,下面的代码非常简单,但由于某些原因,for循环不会遍历记录器的所有处理程序。但是,如果我们在else子句中删除my_logger.removeHandler(handler),则for循环会遍历所有处理程序。知道我做错了什么吗 import logging import sys stdf = logging.Formatter( "%(message)s" ) filef = logging.Formatter( "%(message)s" ) my_logger = logging.getL

下面的代码非常简单,但由于某些原因,for循环不会遍历记录器的所有处理程序。但是,如果我们在else子句中删除my_logger.removeHandler(handler),则for循环会遍历所有处理程序。知道我做错了什么吗

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

这是一个典型的破坏性迭代。您正在做的是:

>>> l= [0, 1, 2, 3, 4]
>>> for n in l:
...     l.remove(n)
... 
>>> l
[1, 3]
在本例中,仅删除第二个元素。为什么?在语法中,的
掩盖了实际发生的情况,这与传统的C样式for index循环中的情况相同:

>>> l= [0, 1, 2, 3, 4]
>>> i= 0
>>> while i<len(l):
...     del l[i]
...     i+= 1
...
>>> l
[1, 3]

当您试图从列表中删除某些项时,使用
过滤器
或列表理解通常是一种更简单的方法。

我认为迭代器在启动迭代器时会遍历所有元素。这意味着说“Python的for循环与C/C++相同”的教程是错误的。。。这意味着在迭代过程中修改列表是危险的。这与C/C++不同,因为C/C++只删除数组指针指向的内容,而不删除数组指针。谢谢你指出这一点。
for handler in list(my_logger.handlers):