首页 > 代码库 > Python functools.partial

Python functools.partial

    def declare_consumer(self, consumer_cls, topic, callback):        """Create a Consumer using the class that was passed in and        add it to our list of consumers        """        def _connect_error(exc):            log_info = {‘topic‘: topic, ‘err_str‘: str(exc)}            LOG.error(_("Failed to declare consumer for topic ‘%(topic)s‘: "                      "%(err_str)s") % log_info)        def _declare_consumer():            consumer = consumer_cls(self.conf, self.channel, topic, callback,                                    six.next(self.consumer_num))            self.consumers.append(consumer)            return consumer        return self.ensure(_connect_error, _declare_consumer)    def declare_direct_consumer(self, topic, callback):        """Create a ‘direct‘ queue.        In nova‘s use, this is generally a msg_id queue used for        responses for call/multicall        """        self.declare_consumer(DirectConsumer, topic, callback)    def declare_topic_consumer(self, topic, callback=None, queue_name=None,                               exchange_name=None):        """Create a ‘topic‘ consumer."""        self.declare_consumer(functools.partial(TopicConsumer,                                                name=queue_name,                                                exchange_name=exchange_name,                                                ),                              topic, callback)    def declare_fanout_consumer(self, topic, callback):        """Create a ‘fanout‘ consumer."""        self.declare_consumer(FanoutConsumer, topic, callback)

functools.partial可以提供对象的默认参数而生成一个新的访问形式,方便统一代码调用形式。以上代码中TopicConsumer类和FanoutConsumer类及DirectConsumer类的构造函数存在差异,如果不使用functools则需要在declare_consumer中进行判断