Python functools.partial
2014-08-05 14:40
316 查看
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
相关文章推荐
- python. partial应用from functools import partial
- python3 functools partial 用于函数的包装器详解
- python的functools.partial用法解释
- Python:functools partial详解
- python的functools.partial用法解释
- python 偏函数应用-functools.partial
- python functools.partial
- python学习代码笔记(map,reduce,filter,sort,decorator,functools.partial)
- python:functools之partial
- 【python】偏函数 functools partial
- Python 装饰器之 functools.wraps
- python 装饰器及标准库functools中的wraps
- Python技巧——list comprehension 与 functools.reduce
- Python Intro - Functools Usage
- functools.partial
- 用Python functools.wraps实现装饰器
- 【Python模块】functools —— 作用于可调用对象的高阶函数集合
- python学习笔记2-functools.wraps 装饰器
- Python functools模块学习总结
- functools 模块partial方法使用