Python';s警告。是否检查消息?

Python';s警告。是否检查消息?,python,warnings,Python,Warnings,如何让Python警告在某个位置首次发出时显示,而不是再次发出 应该只在模块中的特定行显示第一个警告,并且应该在不考虑警告消息的情况下工作,但是它似乎仅适用于具有相同消息字符串的警告。下面是一个使用Python 3.7的MWE: 导入警告 >>>类别MyWarning(警告):通过 ... >>>警告。simplefilter('default',MyWarning) >>>对于范围(3)中的i: ... 警告。警告(str(i),MyWarning)#每次都有唯一的消息 ...

如何让Python警告在某个位置首次发出时显示,而不是再次发出

应该只在模块中的特定行显示第一个警告,并且应该在不考虑警告消息的情况下工作,但是它似乎仅适用于具有相同消息字符串的警告。下面是一个使用Python 3.7的MWE:

导入警告 >>>类别MyWarning(警告):通过 ... >>>警告。simplefilter('default',MyWarning) >>>对于范围(3)中的i: ... 警告。警告(str(i),MyWarning)#每次都有唯一的消息 ... 警告。警告('foo',MyWarning)#每次都是相同的消息 ... __主警告:2:My警告:0 __主要提示:3:MyWarning:foo __主警告:2:My警告:1 __主警告:2:My警告:2 即使我使用
模块
一次
操作(无论如何,我不希望这样),它仍然会每次显示具有唯一消息的操作。此外,即使我使用更明确的消息来匹配任何内容,每次都会显示它们:

warnings.filterwarnings('default',r'.*',mywarnings)

我错过什么了吗?或者文档不准确?

它确实说明过滤器“始终匹配任何消息”,因此任何唯一消息都将始终至少匹配一次。您需要的是一个特定于每行号一次的过滤器,默认情况下不会实现;警告是否会实际显示取决于对消息内容的二次测试?如果将匹配定义为使用as-they键对记录的警告的注册表进行匹配,那么这就不是二次测试了(CPython通常会在中这样做)“次要”是指过滤器不直接确定是否显示警告。匹配筛选器确定随后应用于特定警告(包括其消息)的操作。至少,我现在是这样理解的。注册表似乎只是避免昂贵的过滤器检查的捷径;如果特定警告在注册表中,则不应显示。是的,这是正确的-与注册表(基本上是
dict
)匹配的消息(通过三元组键)将应用过滤器(用于记录、显示、记录、省略或其他),如果不匹配,则将其添加到注册表中。