"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como preservar as assinaturas de funções ao usar decoradores em Python?

Como preservar as assinaturas de funções ao usar decoradores em Python?

Postado em 2025-03-24
Navegar:312

How to Preserve Function Signatures When Using Decorators in Python?

preservando as assinaturas das funções decoradas

decoradores são uma ferramenta poderosa para aprimorar a funcionalidade das funções python. No entanto, às vezes eles podem obscurecer a assinatura da função original. Isso pode ser problemático para documentação, depuração e ferramentas automatizadas. def G (*args, ** kwargs): args = [int (x) para x em args] kwargs = dict ((k, int (v)) para k, v em kwargs.items ()) Retornar f (*args, ** kwargs) Retornar g

Enquanto a decoração funciona conforme o esperado, a assinatura da função decorada é substituída por " args, *kwargs", perdendo informações sobre os argumentos originais. Satisfactory:

copiando manualmente a assinatura no docstring.
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

importar decorador @decorator.Decorator def args_as_ints (f, *args, ** kwargs): args = [int (x) para x em args] kwargs = dict ((k, int (v)) para k, v em kwargs.items ()) Retornar f (*args, ** kwargs)

Este decorador preserva a assinatura da função original, passando -a como argumentos para a função embrulhada. def funny_function (x, y, z = 3): "" "Calcula x*y 2*z" "" Retornar x*y 2*z

agora, a função decorada engraçada_function mantém sua assinatura original:

>> Ajuda (Funny_function) Ajuda na função Funny_function no módulo __main__: Funny_function (x, y, z = 3) Calcula x*y 2*z

    python 3.4:
  • para python 3.4 e acima, functools.wraps fornece uma solução semelhante:
  • importar functools def args_as_ints (func): @functools.wraps (func) DEF Wrapper (*args, ** kwargs): args = [int (x) para x em args] kwargs = dict ((k, int (v)) para k, v em kwargs.items ()) Retornar func (*args, ** kwargs) Return wrapper

usando essas técnicas, os decoradores podem aprimorar a funcionalidade da função enquanto preservam suas assinaturas originais, garantindo clareza e consistência na base de código.

Declaração de lançamento Este artigo é reproduzido em: 1729155261 Se houver alguma violação, entre em contato com [email protected] para excluí -lo.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3