首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试functools.partial是否生成预期的函数对象

如何测试functools.partial是否生成预期的函数对象
EN

Stack Overflow用户
提问于 2014-03-27 16:23:15
回答 1查看 1.6K关注 0票数 6

当从一个API映射到另一个API时,有时可以帮助在每个API中的类似关键字之间映射,允许一个控制器API灵活地分配到其他库,而不需要用户对隐藏的不同API大惊小怪。

假设某些库other_api有一个名为"logarithm"的方法,而基的关键字参数是我需要从代码中提取出来的东西,比如"log_base_val";因此要从other_api中使用它,我需要输入(例如):

代码语言:javascript
复制
other_api.logarithm(log_base_val=math.e)

考虑一下这样的玩具类:

代码语言:javascript
复制
import other_api
import math
import functools

class Foo(object):
    _SUPPORTED_ARGS = {"base":"log_base_val"}

    def arg_binder(self, other_api_function_name, **kwargs):
        other_api_function = getattr(other_api, other_api_function_name)
        other_api_kwargs = {_SUPPORTED_ARGS[k]:v for k,v in kwargs.iteritems()}
        return functools.partial(other_api_function, **other_api_kwargs)

使用Foo,我可以映射其他API,其中这个参数总是被称为base,如下所示:

代码语言:javascript
复制
f = Foo()
ln = f.arg_binder("logarithm", base=math.e)

ln在逻辑上相当于(在kwargs中使用log_base_val=math.e,来自functools):

代码语言:javascript
复制
other_api.logarithm(*args, **kwargs)

但是,通过调用functools手动进行相同的参数绑定将导致不同的函数对象:

代码语言:javascript
复制
In [10]: import functools

In [11]: def foo(a, b):
   ....:     return a + b
   ....: 

In [12]: f1 = functools.partial(foo, 2)

In [13]: f2 = functools.partial(foo, 2)

In [14]: id(f1)
Out[14]: 67615304

In [15]: id(f2)
Out[15]: 67615568

因此,对f1 == f2的测试不会像预期的那样成功:

代码语言:javascript
复制
In [16]: f1 == f2
Out[16]: False

所以问题是:有什么规定的方法来测试参数绑定函数是否导致了正确的输出函数对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 16:24:43

func对象上的partial()属性是对原始函数对象的引用:

代码语言:javascript
复制
f1.func is f2.func

函数对象本身并不实现__eq__方法,所以您最好使用is来测试标识。

类似地,partial().argspartial().keywords包含调用时要传递给函数的参数和关键字参数。

演示:

代码语言:javascript
复制
>>> from functools import partial
>>> def foo(a, b):
...     return a + b
... 
>>> f1 = partial(foo, 2)
>>> f2 = partial(foo, 2)
>>> f1.func is f2.func
True
>>> f1.args
(2,)
>>> f2.args
(2,)
>>> f1.keywords is None
True
>>> f2.keywords is None
True
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22693499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档