• 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中进行判断

    摘一下Python DOC上的说明和例子(https://docs.python.org/2.7/library/functools.html#functools.partial):

    functools.partial(func[,*args][, **keywords])

    Return a new partial object which when called will behave like func called with the positional arguments args and keyword arguments keywords. If more arguments are supplied to the call, they are appended to args. If additional keyword arguments are supplied, they extend and override keywords. Roughly equivalent to:

    def partial(func, *args, **keywords):
        def newfunc(*fargs, **fkeywords):
            newkeywords = keywords.copy()
            newkeywords.update(fkeywords)
            return func(*(args + fargs), **newkeywords)
        newfunc.func = func
        newfunc.args = args
        newfunc.keywords = keywords
        return newfunc
    

    The partial() is used for partial function application which “freezes” some portion of a function’s arguments and/or keywords resulting in a new object with a simplified signature. For example, partial() can be used to create a callable that behaves like the int() function where the base argument defaults to two:

    >>>
    >>> from functools import partial
    >>> basetwo = partial(int, base=2)
    >>> basetwo.__doc__ = 'Convert base 2 string to an int.'
    >>> basetwo('10010')
    18

    自己也来练习一发:

    >>> def say(man, words):
    ...     print 'say', words, 'to', man
    ...
    >>> say('boss', 'hello')
    say hello to boss
    >>> say2boss = functools.partial(say, 'boss')
    >>> say2boss('good morning!')
    say good morning! to boss
    
  • 相关阅读:
    小程序云开发 -- 云函数定时触发器配置
    小程序echarts 构建中国地图并锚定区域点击事件
    微信小程序接入百度OCR(身份证识别)
    微信小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
    微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)
    微信小程序开发技巧总结(二) -- 文件的选取、移动、上传和下载
    SpringBoot Jpa 自定义查询
    SpringBoot Jpa 分页查询最新配置方式
    【软工】提问回顾与个人总结
    【软工】[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE
  • 原文地址:https://www.cnblogs.com/lailailai/p/3892241.html
Copyright © 2020-2023  润新知