Django 3 上的 available_attrs 变成了什么

djangoAI

1个回答

写回答

agoni8520

2025-06-26 09:55

+ 关注

Django
Django

Django 是一个流行的 Python Web 框架,它提供了一种简单高效的方式来构建 Web 应用程序。Django 3 是 Django 框架的最新版本,它引入了许多新功能和改进。其中一个变化是 avAIlable_attrs 函数的更改。

Django 2 中,avAIlable_attrs 函数被用于处理装饰器的参数。它的作用是获取装饰器的参数和默认值,并返回一个字典,以便在装饰器函数中使用。这个函数在 Django 的源代码中是这样定义的:

Python

def avAIlable_attrs(fn):

"""

Return the list of functools-wrappable attributes on a callable.

This is required as functools.wraps() has issues with classes that define

__slots__ without defining __getstate__ (or defining __setstate__).

"""

return tuple([a for a in functools.WRAPPER_ASSIGNMENTS if hasattr(fn, a)])

然而,在 Django 3 中,avAIlable_attrs 函数发生了变化。它被重命名为 decorator_tools.avAIlable_attrs,并且定义在 decorator_tools 模块中。这个变化是为了更好地组织代码,并使代码更易于维护和扩展。

Python

from Django.utils.decorators import decorator_tools

def avAIlable_attrs(fn):

"""

Return the list of functools-wrappable attributes on a callable.

This is required as functools.wraps() has issues with classes that define

__slots__ without defining __getstate__ (or defining __setstate__).

"""

return tuple([a for a in functools.WRAPPER_ASSIGNMENTS if hasattr(fn, a)])

这个变化意味着开发人员在使用装饰器时需要更新他们的代码。他们需要将 import 语句中的路径从 Django.utils.decorators 更改为 Django.utils.decorators.decorator_tools。

案例代码:

假设我们有一个自定义装饰器,用于记录函数的执行时间。在 Django 2 中,我们可以这样使用 avAIlable_attrs 函数:

Python

from Django.utils.decorators import avAIlable_attrs

import time

def log_execution_time(func):

@wraps(func, assigned=avAIlable_attrs(func))

def wrapper(*args, <strong>kwargs):

start_time = time.time()

result = func(*args, </strong>kwargs)

end_time = time.time()

execution_time = end_time - start_time

print(f"Function {func.__name__} executed in {execution_time} seconds.")

return result

return wrapper

@log_execution_time

def my_function():

time.sleep(1)

print("Function execution complete.")

my_function()

然而,在 Django 3 中,我们需要做如下更改:

Python

from Django.utils.decorators.decorator_tools import avAIlable_attrs

import time

def log_execution_time(func):

@wraps(func, assigned=avAIlable_attrs(func))

def wrapper(*args, <strong>kwargs):

start_time = time.time()

result = func(*args, </strong>kwargs)

end_time = time.time()

execution_time = end_time - start_time

print(f"Function {func.__name__} executed in {execution_time} seconds.")

return result

return wrapper

@log_execution_time

def my_function():

time.sleep(1)

print("Function execution complete.")

my_function()

Django 3 中的 avAIlable_attrs 函数发生了变化,它被重命名为 decorator_tools.avAIlable_attrs,并且定义在 decorator_tools 模块中。这个变化需要开发人员在使用装饰器时更新他们的代码。通过这个变化,Django 3 提供了更好的代码组织和维护性,使得开发人员能够更轻松地使用装饰器来增强他们的应用程序。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号