Python函数“指针”:检查无

时间:2017-01-27 12:12:58

标签: python function-pointers

我希望课程能够在某个特定事件上调用我的函数。我的问题是,检查“无”以检查函数“指针”是否已初始化是一种好习惯吗?还有其他陷阱使用这种模式吗?

课堂上:

class Consumer(object):
    _functionCallBack = None

    def __init__(self, hostName):
        self._hostName = hostName

    def SetCallBack(self, funcCallback):
        self._functionCallBack = funcCallback

    def HandleMessage(self, body):
        print(" [x] Received %r" % body)
        if self._functionCallBack is not None:
            self._functionCallBack(body)

在调用代码时:

def handleMessageReceived(message):
    print("In call back", message);

def main():
    Consumer = Consumer("hostname")
    consumer.SetCallBack(handleMessageReceived)
    consumer.Start()


if __name__ == "__main__" : main()

我无法找到任何最佳做法 - 如果Python文档中有一些可以让我知道。

2 个答案:

答案 0 :(得分:1)

您通常应该使用if ...不是None:构造来检测未初始化的变量。一个选项是使用try / catch子句,但是你的情况不是意外的备用流,可以避免try / catch。

另见:How to test whether a variable has been initialized before using it?

答案 1 :(得分:1)

这里的解决方案(来自设计POV)将使用NullObject模式 - 在这种情况下,使默认functionCallback成为无操作模式,这样您就不必测试任何东西。此外,您可能希望在实例时传递回调而不是稍后添加(除非在您的实际代码中,您需要在当前的不同阶段执行此操作)

def noop(message):
    pass

class Consumer(object):
    def  __init__(self, hostname, callback=noop):
        self._hostname = hostname
        self._callback = callback

    def set_callback(self, callback):
        self._callback = callback

    def handle_message(self, body):
        logger.info(" [x] Received %r", body)
        self._callback(body)

现在,这是否比针对None的测试更好,还有待读者的赞赏。专业人士:你没有特殊情况,缺点:你有一个可能没用的函数调用。如果您期望Consumer个实例在大多数情况下获得有效回调,那么" no-op回调"解决方案可能会稍微清洁,否则"检查无"完全有效。