"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 파이썬에서 데코레이터를 사용할 때 기능 서명을 보존하는 방법은 무엇입니까?

파이썬에서 데코레이터를 사용할 때 기능 서명을 보존하는 방법은 무엇입니까?

2025-03-24에 게시되었습니다
검색:117

How to Preserve Function Signatures When Using Decorators in 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
: def g (*args, ** kwargs) : Args = [args에서 x의 int (x)] kwargs = dict (kwargs.items ()의 k, v에 대한 (k, int (v))) 반환 f (*args, ** kwargs) return g

장식은 예상대로 작동하는 동안 장식 된 기능의 서명은 " args,

*kwargs"로 대체됩니다.

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)

만족 :

서명을 수동으로 docstring에 수동으로 복사합니다.

각 특정 서명에 대한 새 장식자를 작성하십시오. 우아한 솔루션 :
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)
데코레이터를 가져옵니다 @decorator.decorator def args_as_ints (f, *args, ** kwargs) : Args = [args에서 x의 int (x)] kwargs = dict (kwargs.items ()의 k, v에 대한 (k, int (v))) return f (*args, ** kwargs)

>>> help(funny_function)
Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y   2*z

이제 장식 된 기능 funny_function은 원래 서명을 유지합니다 : >>> help (funny_function). 모듈의 기능에 대한 도움말 __main__ : funny_function (x, y, z = 3) x*y 2*z

python 3.4 :
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)

How to Preserve Function Signatures When Using Decorators in Python?

whraps는 유사한 솔루션을 제공합니다. def args_as_ints (func) : @functools.wraps (func) Def Wrapper (*args, ** kwargs) : Args = [args에서 x의 int (x)] kwargs = dict (kwargs.items ()의 k, v에 대한 (k, int (v))) 반환 핵 (*args, ** kwargs) Return Wrapper

이러한 기술을 사용하여 데코레이터는 원래 서명을 유지하면서 기능 기능을 향상시켜 코드베이스의 명확성과 일관성을 보장 할 수 있습니다.

릴리스 선언문 이 기사는 다음과 같이 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3