gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:47:05 24 4
gpt4 key购买 nike

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

为了能够做到这一点,我从一组选择中选择一个函数(取决于上下文),使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com