gpt4 book ai didi

python - Django 2.1 - 'functools.partial' 对象没有属性 '__name__'

转载 作者:行者123 更新时间:2023-11-28 20:57:50 28 4
gpt4 key购买 nike

我最近将 Django 从 2.0.7 升级到 2.1.1,出现了一个新错误,我得到了这个错误 'functools.partial' object has no attribute '__name__'

我想了解我的修复是否正确以及导致这个新错误发生的原因,我在 django 发行说明上找不到与此问题相关的任何内容,也许我错过了。

装饰器.py

def auth0_login_required(function):
def wrap(request, *args, **kwargs):

if request.isAuthenticated or request.user.is_staff:
pass
else:
raise Http404()

return function(request, *args, **kwargs)
wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__ # ERROR HERE
return wrap

如何使用,views.py:

@method_decorator(auth0_login_required, name='dispatch')
class Dashboard(View):
...

为了修复,我刚刚删除了 wrap.__name__ = function.__name__,但我不确定它是否会破坏其他东西。

最佳答案

与其手动复制内容,不如使用 @functools.wraps() decorator为您处理:

from functools import wraps

def auth0_login_required(function):
@wraps(function)
def wrap(request, *args, **kwargs):

if request.isAuthenticated or request.user.is_staff:
pass
else:
raise Http404()

return function(request, *args, **kwargs)

return wrap

@wraps() 装饰器(通过 functools.update_wrapper() function it calls 知道如何正确处理 functools.partial 对象(或者更确切地说,它可以处理 functools.partial 对象没有 __name__ 属性。

View 类中找到的被包装的 functools.partial() 对象没有 __name__ 属性没关系,什么不是很好的是,即使您正在装饰确实具有该属性的函数,您也根本不会复制该属性。如果您不想使用 @wraps(),则必须手动复制属性并自己处理异常:

try:
wrap.__name__ = function.__name__
except AttributeError:
pass
try:
wrap.__doc__ = function.__doc__
except AttributeError:
pass

但请注意,这不会复制 __qualname____module____annotations__ 属性,不会处理任何自定义属性集在 function 上(其他装饰器可能依赖)。 @functools.wraps() 确实处理了所有这些,而且它在 would let you unwrap the decorator again 的装饰器包装函数上设置了 __wrapped__ 属性。 .

关于python - Django 2.1 - 'functools.partial' 对象没有属性 '__name__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52271368/

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