- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试调试别人的 Python 代码中的异常,但我不是 Python 专家。该代码尝试刷新并删除标准 Python 记录器上的所有处理程序:
def restart_logging(logger_id):
logger = logging.getLogger(logger_id)
while logger.handlers:
handler = logger.handlers[0]
handler.flush()
logger.removeHandler(handler)
init_logging(logger_id)
这会引发异常:
File "/usr/lib64/python2.6/logging/__init__.py", line 1208, in removeHandler
self.handlers.remove(hdlr)
ValueError: list.remove(x): x not in list
我已经查看了 StackOverflow 的其他“x 不在列表中”问题,它们都属于这两类:
for x in list: list.remove(x)
而不是 while list: list.remove(list[0])
)我不明白这两者在这里如何适用。
首先,使用 while 循环:当仍然有处理程序时,获取第一个处理程序(成功,否则会出现 IndexError
),刷新它,删除它。即使删除了列表中的多个条目,这也是一个 while 循环测试列表是否仍然有条目,而不是迭代(可能删除)对象的 for 循环。
查看logging
模块源代码,它只调用remove()
一次,甚至检查处理程序是否在调用remove()
之前的列表:
def removeHandler(self, hdlr):
"""
Remove the specified handler from this logger.
"""
if hdlr in self.handlers:
#hdlr.close()
hdlr.acquire()
try:
self.handlers.remove(hdlr)
finally:
hdlr.release()
此代码作为 Django Web 应用程序的一部分执行。我可以理解,例如,如果它是一个 Java J2EE 应用程序,其中两个线程可以同时访问同一个列表,并且没有锁来使“获取第一项并删除它”成为原子操作,因此两个线程都会看到相同的内容列表中的元素,但只有一个会删除它,另一个会失败,因为线程删除了第一个线程的“此项目是否在列表中”和“从列表中删除此项目”之间的元素。
但是,据我了解,Python 没有并发性,并且使用全局解释器锁来阻止同时发生多件事情。所以这应该是不可能的。
所以,我无法弄清楚为什么 list.remove(x): x not in list
在这里发生,而且我无法制作一个可靠发生的测试用例。我可以做些什么来进一步理解这个问题?
最佳答案
虽然单个操作可能是原子的(以及您可能已经注意到的 list.remove
等操作,但这只是由于 CPython 的实现细节而造成的), removeHandler
当然不是。在 Python 2.6 实现中(您已经发布了非常有帮助的内容),上下文切换可以在 if
之后发生。语句和锁获取之前(假设这就是 hdlr.acquire()
所做的)。因此,如果两个线程同时调用此函数,则当一个线程随后释放其对 GIL 的持有而另一个线程运行整个过程直至完成时,肯定会引发异常(原始线程将从 if、处理程序内部继续)仍然指向原始的,它将获取 IO 锁,然后尝试将其从列表中删除,从而导致不必要的异常)。
在 Python 2.7 中,此问题已得到修复,removeHandler
方法改为:
def removeHandler(self, hdlr):
"""
Remove the specified handler from this logger.
"""
_acquireLock()
try:
if hdlr in self.handlers:
self.handlers.remove(hdlr)
finally:
_releaseLock()
请注意现在如何在 if 语句之前获取锁。
关于python - logger.removeHandler(logger.handlers[0]) 如何抛出 ValueError : list. 删除(x) : x not in list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46217752/
我正在尝试并行运行具有循环返回值的函数。但它似乎停留在 results = pool.map(algorithm_file.foo, population) 在 for 循环的第二次迭代中 r
Serving Flask 应用程序“服务器”(延迟加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产 WSGI 服务器。 Debug模式:开启 在 http://0.0.
我使用“product.pricelist”模型中的 get_product_price_rule() 函数。我的代码是: price = self._get_display_price(produ
我收到以下错误: Traceback (most recent call last): File "/home/odroid/trackAndFollow/getPositions.py", line
我正在尝试采用机器学习方法,但遇到了一些问题。这是我的代码: import sys import scipy import numpy import matplotlib import pandas
我尝试使用 tensorflow 1.4.0 对我的原始记录进行分类。过程如下。 拳头:读取图片和标签,输出“tfrecord”格式的文件。第二:读取tf记录和训练 编写tfrecord脚本是 !/u
我是新手,所以需要任何帮助,当我要求一个例子时,我的教授给我了这段代码,我希望有一个工作模型...... from numpy import loadtxt import numpy as np fr
我无法弄清楚为什么会出现此 ValueError...为了提供一些上下文,我正在使用 requests、BeautifulSoup 和 json 与 python 来抓取站点 json 数据。 我不确
我已经尝试使用这两个循环以及列表理解。即使我正在尝试将数字转换为列表中的整型,两者都无法解析整数。
我已经尝试使用这两个循环以及列表理解。即使我正在尝试将数字转换为列表中的整型,两者都无法解析整数。
我只有四个星期的 Python 经验。使用 Tkinter 创建一个工具,将新的公司 Logo 粘贴到现有图像之上。 下面的方法是获取给定目录中的所有图像并将新 Logo 粘贴到初始级别。现有图像、编
我只有四个星期的 Python 经验。使用 Tkinter 创建一个工具,将新的公司 Logo 粘贴到现有图像之上。 下面的方法是获取给定目录中的所有图像并将新 Logo 粘贴到初始级别。现有图像、编
我在尝试在 Keras 2.0.8、Python 3.6.1 和 Tensorflow 后端中训练模型时遇到问题。 错误消息: ValueError: Error when checking targ
我已经尝试使用这两个循环以及列表理解。即使我正在尝试将数字转换为列表中的整型,两者都无法解析整数。
我有这段代码: while True: try: start = int(input("Starting number: ")) fin = int(i
我是 python 的初学者编码员,试图制作一个“模具滚筒”,您可以在其中选择模具的大小,它在我的代码的第 20 行返回此错误 import sys import random import geto
我有以下代码: import fxcmpy import pandas as pd from pandas import datetime from pandas import DataFrame a
我正在尝试使用 django 和 python 制作一个博客应用程序。我也在尝试使用 s3 存储桶进行存储,使用 heroku 进行部署。我正在学习 coreymschafer 的在线教程。我正在按照
我创建了一个 numpy 数组(考虑输入数据)并想更改顺序(一些数值运算后的输出数据)。在使用转换后的数组时,我遇到错误并找到了根本原因。请在下面找到详细信息并使用 numpy 版本 1.19.1 i
我已经引用了之前的查询 All arguments should have the same length plotly但仍然没有得到我的问题的答案。 我有一个黄金价格数据集。 Date
我是一名优秀的程序员,十分优秀!