代码之家  ›  专栏  ›  技术社区  ›  Erel Segal-Halevi

每个程序只发出一次警告

  •  2
  • Erel Segal-Halevi  · 技术社区  · 6 年前

    我有一个带有用户警告的函数:

    warnings.warn(message)
    

    warnings.simplefilter('once', UserWarning)
    

    但它似乎不起作用-我在同一个程序中多次收到相同的警告。

    我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Patrick Artner    6 年前

    您可以构造一个类来执行并记忆给定的警告:

    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