Python 具有多个布尔条件的函数还是多个函数?

Python 具有多个布尔条件的函数还是多个函数?,python,function,Python,Function,我试图为我的项目定义一个“util”模块,其中基本util函数是“display windows”(本例中为opencv项目): 除了基本的“显示”,我还想有多个选项,比如 向窗口添加文本(cv2.putText() 显示窗口后等待(cv2.waitKey()) 销毁窗口(cv2.destroyAllWindows()) 等 我想知道如何实现这一点,一个选项是添加多个具有默认值的布尔值,然后使用如下内容: def display_windows(windows_to_display, with_

我试图为我的项目定义一个“util”模块,其中基本util函数是“display windows”(本例中为opencv项目):

除了基本的“显示”,我还想有多个选项,比如

  • 向窗口添加文本(cv2.putText()

  • 显示窗口后等待(cv2.waitKey())

  • 销毁窗口(cv2.destroyAllWindows()) 等
  • 我想知道如何实现这一点,一个选项是添加多个具有默认值的布尔值,然后使用如下内容:

    def display_windows(windows_to_display, with_text=False, with_wait=False, destroy_first=False):
        if destroy_first:
            cv2.destroyAllWindows()
        for window_tag, window in windows_to_display:
            if with_text:
                cv2.putText(window, 'text', ...)
            cv2.imshow(window_tag, window)
        if with_wait:
            cv2.waitKey(0)
    
    或者,我可以声明几个函数,使用“基本”“显示窗口”,然后添加,比如:

    def display_windows_and_wait(self, windows_to_display, with_text=False, destroy_first=False):
        display_windows(windows_to_display, with_text)
        cv2.waitKey(0)
    
    等等

    我对这两种选择都不完全满意; 使用布尔方法,我不太喜欢:

    display_windows(windows, True, True, True)
    
    分散在各地,因为信息量不大

    使用多功能方法,不确定这是否真的有用

    有没有想过哪种方法可以提高可读性? 或者更好的是,有没有更好的方法来处理这个问题

    非常感谢

  • 而不是打电话

    display_windows(windows, True, True, True)
    
    您仍然可以在参数中使用键:

    display_windows(windows, with_text=True, with_wait=True, destroy_first=True)
    
  • 您可以先定义一些常量,然后使用它们:

    WITH_TEXT = True         # possibly also NO_TEXT = False, NO_WAIT = False, etc.
    WITH_WAIT = True
    DESTROY_FIRST = True
    
    display_windows(windows, WITH_TEXT, WITH_WAIT, DESTROY_FIRST)
    
  • 您只能使用1个带有位作为标志的参数:

    WITH_TEXT = 0b001
    WITH_WAIT = 0b010
    DESTROY_FIRST = 0b100
    
    调用函数的示例如下:

    display_windows(windows, WITH_TEXT|DESTROY_FIRST)
    
    以及函数定义中的更改:

    def display_windows(windows_to_display, flags=0):
        if flags & DESTROY_FIRST:
            cv2.destroyAllWindows()
        # and so on
    
    它的优点-在调用函数时:

    display_windows(windows, WITH_TEXT|DESTROY_FIRST)
    
  • 标志(在第2个参数中)可以是*任意顺序*
  • 带有
    False
    值的标志被简单地省略

  • 我喜欢第一个,因为它可以最大限度地减少错误的风险。你甚至可以交换参数,它仍然是正确的。相比之下,第二个,大大增加了错误的风险,因为它甚至隐藏了交换参数的潜在问题,在某种程度上它看起来是正确的,但实际上不是。所以我绝对不推荐第二个。但是第一个很好。我添加了第三个备选方案,IMHO是最好的。-如果你喜欢我的答案,为什么不接受它和/或投票?如果我发现部分答案不好,我不会投票。在这种情况下,我发现第二个建议不好。我的评论是关于我如何发现第二个建议适得其反并导致bUG。如果只提到第一个,我会直接投票回答。我也不喜欢新的第三个建议,因为有效的值不从函数定义中清楚(我知道它在C和C++中很常见,但我还是不喜欢)。,但这有点小。但在我看来,建议2非常糟糕,而且容易出现错误。我想我会选择选项1,让它信息丰富且清晰。感谢您提供多种解决方案,尽管我不得不说我不喜欢选项2和3。:@DM15,不客气。每种选择都有其利弊。