> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 데코레이터를 사용할 때 함수 서명을 보존하는 방법은 무엇입니까?

Python에서 데코레이터를 사용할 때 함수 서명을 보존하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-10-17 16:59:58
원래의
517명이 탐색했습니다.

How to Preserve Function Signatures When Using Decorators in Python?

Preserving Signatures of Decorated Functions

Decorators are a powerful tool for enhancing the functionality of Python functions. However, they can sometimes obscure the original function's signature. This can be problematic for documentation, debugging, and automated tools.

Problem:

Consider a generic decorator that converts all arguments to integers:

1

2

3

4

5

6

<code class="python">def args_as_ints(f):

    def g(*args, **kwargs):

        args = [int(x) for x in args]

        kwargs = dict((k, int(v)) for k, v in kwargs.items())

        return f(*args, **kwargs)

    return g</code>

로그인 후 복사

While the decoration works as expected, the decorated function's signature is replaced with "args, *kwargs", losing information about the original arguments.

Workarounds:

Several workarounds exist, but none are fully satisfactory:

  • Manually copying the signature into the docstring.
  • Creating a new decorator for each specific signature.
  • Manually constructing the decorated function with exec.

Solution:

decorator module offers an elegant solution:

1

2

3

4

5

6

7

<code class="python">import decorator

 

@decorator.decorator

def args_as_ints(f, *args, **kwargs):

    args = [int(x) for x in args]

    kwargs = dict((k, int(v)) for k, v in kwargs.items())

    return f(*args, **kwargs)</code>

로그인 후 복사

This decorator preserves the original function's signature by passing it as arguments to the wrapped function.

Improved Decorator:

1

2

3

4

<code class="python">@args_as_ints

def funny_function(x, y, z=3):

    """Computes x*y + 2*z"""

    return x*y + 2*z</code>

로그인 후 복사

Now, the decorated function funny_function retains its original signature:

1

2

3

4

5

>>> help(funny_function)

Help on function funny_function in module __main__:

 

funny_function(x, y, z=3)

    Computes x*y + 2*z

로그인 후 복사

Python 3.4+:

For Python 3.4 and above, functools.wraps provides a similar solution:

1

2

3

4

5

6

7

8

9

<code class="python">import functools

 

def args_as_ints(func):

    @functools.wraps(func)

    def wrapper(*args, **kwargs):

        args = [int(x) for x in args]

        kwargs = dict((k, int(v)) for k, v in kwargs.items())

        return func(*args, **kwargs)

    return wrapper</code>

로그인 후 복사

By using these techniques, decorators can enhance function functionality while preserving their original signatures, ensuring clarity and consistency in the codebase.

위 내용은 Python에서 데코레이터를 사용할 때 함수 서명을 보존하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿