Python conserve les méthodes de métadonnées pour les fonctions décorées

小云云
Libérer: 2018-03-29 13:42:03
original
1457 Les gens l'ont consulté

Cet article présente principalement en détail comment Python conserve les métadonnées pour les fonctions décorées. J'espère qu'il pourra vous aider.

Cas :

L'objet fonction stocke certaines métadonnées de fonction, telles que :

f.__name__ Nom de la fonction

f. __doc__ Document de fonction

f.__moudle__ Nom du module auquel appartient la fonction Dictionnaire d'attributs

                                                              

Après avoir utilisé le décorateur, lors de l'accès aux propriétés ci-dessus dans le décorateur, qu'est-ce que nous voyons, ce sont les métadonnées de la fonction décorateur

Exigences :

Comment implémenter dans la fonction décorateur pour conserver les métadonnées de la fonction décorée

?

Il est implémenté via les méthodes wraps et update_wrapper dans functools, chacune pouvant être implémentée séparément


#!/usr/bin/python3
 
import time
from functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
 
 
def count_time(func):
  """
  给目标函数加上计算运行时间统计
  """
  # 这个装上器和update_wrapper一样,默认参数WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  @wraps(func)
  def wrapper(*args, **kwargs):
    start_time = time.time()
     
    # 定义result接收函数返回值,并且在装饰函数最后返回回去
    resutl = func(*args, **kwargs)
    print('运行时间:', time.time()-start_time)
    return resutl
   
  # 其中默认参数 WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  # update_wrapper(wrapper, func)
  return wrapper
 
 
@count_time
def add(num=100):
  """
  计算 0~num 累加值,默认num=100
  """
  time.sleep(1)
  return sum([x for x in range(num+1)])
 
if __name__ == '__main__':
  print('函数名:', add.__name__)
  print('属性字典:', add.__dict__)
  print('函数默认参数:', add.__defaults__)
  print('函数所在模块:', add.__module__)
  print('函数文档:', add.__doc__)
   
  # 打印两个默认参数
  print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
  result = add()
  print(result)
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal