python - 部分函数对象没有属性 "__code__"

标签 python python-3.x partial functools

我正在编写一个小型应用程序,它接受用户的输入,为他们提供一组可供使用的最佳参数。 (每一组都有排名,用户可以选择他们想要使用的一组)

为了能够做到这一点,我从一组选择中选择一个函数(取决于上下文),使用 functools.partial 部分填充该函数,然后将部分对象返回到另一个模块,该模块依次调用具有 python 接口(interface)的 C++ 库 (dlib)。

直到今天,我还没有使用 functools.partial 来填充函数,也没有遇到任何问题。但为了使代码减少重复且更易于理解,我添加了该部分。添加该部分后,我收到以下错误:

AttributeError: 'functools.partial' object has no attribute '__code__'

我读了一些帖子,意识到这是 partial 对象的问题,因为它们通常缺少 __name____module__ 等属性,但是我不知道如何解决这个问题。

PS:我使用的是python 3.7

编辑

我添加了一个小代码来重现错误

from functools import partial
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from dlib import find_max_global

def objective_calculator(*args, X, y):
    args = args[0]
    model = LogisticRegression()
    model.set_params(**{'class_weight': args[0], 'max_iter':args[1]})
    model.fit(train['data'], train['target'])
    predictions = model.predict(X)
    return accuracy_score(y, predictions)

train = load_breast_cancer()
obj_calc = partial(objective_calculator, X=train['data'], y=train['target'])
lower_bounds = [0.1, 10] # class_weight, max_iter
upper_bounds = [0.5, 200] # class_weight, max_iter
is_integer_variable = [False, True]

find_max_global(f=obj_calc,
                bound1=lower_bounds,
                bound2=upper_bounds,
                num_function_calls=2,
                is_integer_variable=is_integer_variable,
                solver_epsilon=1,)

运行上面的代码会出现以下错误

AttributeError: 'functools.partial' object has no attribute '__code__'

是否建议手动将 __code__ 属性添加到部分对象?

最佳答案

AttributeError: 'functools.partial' object has no attribute '__code__'

为了解决这个错误,我们可以使用

包裹

functools.WRAPPER_ASSIGNMENTS 更新属性, 默认为 ('module', 'name', 'doc') 在Python 2.7.6中 或者,

我们只能更新现有属性...

import functools

import itertools

def wraps_safely(obj, attr_names=functools.WRAPPER_ASSIGNMENTS):
return wraps(obj, assigned=itertools.ifilter(functools.partial(hasattr, obj), attr_names))

`>>> def foo():
`... `   ` """ Ubiquitous foo function ...."""`
... 

>>> functools.wraps(partial(foo))(foo)()

`Traceback (most recent call last):



File "<stdin>", line 1, in <module>



 File ```"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/functools.py", ``line 33, in update_wrapper`

setattr(wrapper, attr, getattr(wrapped, attr))

AttributeError: 'functools.partial' object has no attribute '__module__'

>>> wraps_safely(partial(foo))(foo)()

>>> `

`

过滤掉所有不存在的属性。

第二种方法是:-

*仅严格处理部分对象。

fold 使用 singledispatch 进行包装,并创建包装的部分对象,其属性将从函数“fun”属性中获取。

导入函数工具

  def wraps_partial(wrapper, *args, **kwargs):
`    """ Creates a callable object whose attributes will be set from the partials nested func attribute ..."""

 ` ` ` wrapper = wrapper.func``



 while isinstance(wrapper, functools.partial):


 wrapper = wrapper.func


 return functools.wraps(wrapper, *args, **kwargs)

# after returning functools.wraps

def foo():
""" Foo function.
:return: None """


 pass

>>> wraps_partial(partial(partial(foo)))(lambda : None).__doc__

' Foo Function, returns None '

>>> wraps_partial(partial(partial(foo)))(lambda : None).__name__

'foo'

>>> wraps_partial(partial(partial(foo)))(lambda : None)()

>>> pfoo = partial(partial(foo))



 >>> @wraps_partial(pfoo)



 ... def not_foo():


 ... 




 """ Not Foo function ... """


    ... 

 >>> not_foo.__doc__



 ' Foo Function, returns None '

>>> not_foo.__name__

'foo'



 >>>

现在我们可以获得原始函数文档。

python(CPython)3.

从 functools 导入换行,部分,WRAPPER_ASSIGNMENTS

尝试:

 wraps(partial(wraps))(wraps)



 except AttributeError:



  @wraps(wraps)


 def wraps(obj, attr_names=WRAPPER_ASSIGNMENTS, wraps=wraps):


 return wraps(obj, assigned=(name for name in attr_names if hasattr(obj, name)))

*只有当我们无法包装部分时,我们才定义一个新的包装函数,* *使用原始包装来复制文档*

还有,

在(Python 3.5)中,我们有对原始函数的引用,并且它被维护在部分中。您可以通过 .func:

访问它

functools导入部分

 def a(b):
print(b)


In[20]:  c=partial(a,5)


In[21]:  c.func.__module__

Out[21]: '__main__'

In[22]:  c.func.__name__

Out[22]: 'a'

关于python - 部分函数对象没有属性 "__code__",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56881670/

相关文章:

python - 有人能解释一下这个说法吗? lpadded = win//2 * [-1] + l + win//2 * [-1]

php - 动态图像调整大小

python - 在 Python 中将带有数组的嵌套 JSON 转换为 DataFrame

python - 如何在linux终端直接执行*.pyc文件

python - 从 .py 文件中提取 Python 函数名称、主体和文档类型

python-3.x - 无法在 M1 Mac 上使用 Pip 安装 OpenCV

python - 在 Turtle 中不设置动画 - Python 3.4?

javascript - 指令 templateUrl 重定向到/

mysql - 总列和部分列/列作为总列

javascript - Rails - jQuery/AJAX 不刷新部分