- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个小型应用程序,它接受用户的输入,为他们提供一组可供使用的最佳参数。 (每一组都有排名,用户可以选择他们想要使用的一组)
为了能够做到这一点,我从一组选择中选择一个函数(取决于上下文),使用 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'
>>>
从 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/
我正在编写一个小型应用程序,它接受用户的输入,为他们提供一组可供使用的最佳参数。 (每一组都有排名,用户可以选择他们想要使用的一组) 为了能够做到这一点,我从一组选择中选择一个函数(取决于上下文),使
我正在探索 __code__ 属性和 ast 模块,发现奇怪的行为,函数的第一次调用不会输出任何内容: In [3]: def foo(): ...: print('foo') .
以下作品: def spam(): print "spam" exec(spam.__code__) spam 但是如果 spam 接受参数怎么办? def spam(eggs): p
我预计以下结果会导致 y 成为自由变量: def f(x): return x + y 但是,f.__code__.co_freevars 等于 (),f.__code__.co_varnam
我正在研究缓存系统。这个想法是它可以检测创建缓存对象的函数自其初始创建以来是否已更改,从而使缓存文件无效。 我偶然发现了 python 的 function.__code__属性,即已编译函数的字节码
在昨天的前一个问题中,在评论中,我了解到在 python __code__ 中函数的属性是可变的。因此我可以编写如下代码 def foo(): print "Hello" def foo2()
我想以静态方式获取函数的 co_firSTLineno,展开的函数是可以的,但是如果一个方法被包装了,我只能得到包装函数所在的lineno。 md.py import functools def ru
我是一名优秀的程序员,十分优秀!