每个程序只发出一次警告
Issue a warning only once per program
我有一个函数有一些用户警告:
warnings.warn(message)
我想让它只在第一次遇到的时候显示消息,然后就变成无声了。
我在文档中发现的最接近的是在程序启动时发布:
warnings.simplefilter('once', UserWarning)
但它似乎不起作用 - 我在同一个程序中多次收到相同的警告。
我该怎么做?
您可以构造一个 class 来执行并记住给定的警告:
class WarnOnlyOnce:
warnings = set()
@classmethod
def warn(cls,message):
# storing int == less memory then storing raw message
h = hash(message)
if h not in cls.warnings:
# do your warning
print(f"Warning: {message}")
cls.warnings.add(h)
WarnOnlyOnce.warn("First warning")
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("Second warning")
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("Last warning")
WarnOnlyOnce.warn("LAst warning") # different spelling
WarnOnlyOnce.warn("LASt warning") # different spelling
WarnOnlyOnce.warn("LAST warning") # different spelling
输出:
Warning: First warning
Warning: Second warning
Warning: Last warning
Warning: LAst warning
Warning: LASt warning
Warning: LAST warning
我有一个函数有一些用户警告:
warnings.warn(message)
我想让它只在第一次遇到的时候显示消息,然后就变成无声了。
我在文档中发现的最接近的是在程序启动时发布:
warnings.simplefilter('once', UserWarning)
但它似乎不起作用 - 我在同一个程序中多次收到相同的警告。
我该怎么做?
您可以构造一个 class 来执行并记住给定的警告:
class WarnOnlyOnce:
warnings = set()
@classmethod
def warn(cls,message):
# storing int == less memory then storing raw message
h = hash(message)
if h not in cls.warnings:
# do your warning
print(f"Warning: {message}")
cls.warnings.add(h)
WarnOnlyOnce.warn("First warning")
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("Second warning")
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("First warning") # skipped - identical spelling
WarnOnlyOnce.warn("Last warning")
WarnOnlyOnce.warn("LAst warning") # different spelling
WarnOnlyOnce.warn("LASt warning") # different spelling
WarnOnlyOnce.warn("LAST warning") # different spelling
输出:
Warning: First warning
Warning: Second warning
Warning: Last warning
Warning: LAst warning
Warning: LASt warning
Warning: LAST warning