Python使用修饰器执行函数的参数检查功能示例

 更新时间:2017年09月26日 10:57:50   作者:Inside_Zhang  
这篇文章主要介绍了Python使用修饰器执行函数的参数检查功能,结合具体实例形式分析了Python实现修饰器针对函数参数检查的原理、步骤与相关操作技巧,需要的朋友可以参考下

本文实例讲述了Python使用修饰器执行函数的参数检查功能。分享给大家供大家参考,具体如下:

参数检查:1. 参数的个数;2. 参数的类型;3. 返回值的类型。

考虑如下的函数:

import html
def make_tagged(text, tag):
  return '<{0}>{1}</{0}>'.format(tag, html.escape(text))

显然我们希望传递进来两个参数,且参数类型/返回值类型均为str,再考虑如下的函数:

def repeat(what, count, separator) :
  return ((what + separator)*count)[:-len(separator)]

显然我们希望传递进来三个参数,分别为str,int,str类型,可对返回值不做要求。

那么我们该如何实现对上述参数要求,进行参数检查呢?

import functools
def statically_typed(*types, return_type=None):
  def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
      if len(args) > len(types):
        raise ValueError('too many arguments')
      elif len(args) < len(types):
        raise ValueError('too few arguments')
      for i, (type_, arg) in enumerate(zip(types, args)):
        if not isinstance(type_, arg):
          raise ValueError('argument {} must be of type {}'.format(i, type_.__name__))
      result = func(*args, **kwargs)
      if return_type is not None and not isinstance(result, return_type):
        raise ValueError('return value must be of type {}'.format(return_type.__name__))
      return wrapper
    return decorator

这样,我们便可以使用修饰器模板执行参数检查了:

@statically_typed(str, str, return_type=str)
def make_tagged(text, tag):
  return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
@statically_typed(str, int, str)
def repeat(what, count, separator):
  return ((what + separator)*count)[:-len(separator)]

注:从静态类型语言(C/C++、Java)转入 Python 的开发者可能比较喜欢用修饰器对函数的参数及返回值执行静态类型检查,但这样做会增加 Python 程序在运行期的开销,而编译型语言则没有这种运行期开销(Python 是解释型语言)。

更多关于Python相关内容可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • 一文带你探索Python中的eventlet通信机制

    一文带你探索Python中的eventlet通信机制

    这篇文章主要为大家详细介绍了Python中的eventlet通信机制的相关知识,文中的示例代码讲解详细,对我们深入了解Python有一定帮助,需要的可以参考一下
    2023-06-06
  • 基于python做一个2048小游戏

    基于python做一个2048小游戏

    2048的逻辑无非是操作4*4的方格,每个方格中有一个数,这些数可以移动,如果两个相同的数字在移动时相撞了,就可以彼此合并,本文将给大家介绍如何基于python做一个2048小游戏,感兴趣的小伙伴跟着小编一起来看看吧
    2024-01-01
  • Python实现DBSCAN聚类算法并样例测试

    Python实现DBSCAN聚类算法并样例测试

    聚类是一种机器学习技术,它涉及到数据点的分组,聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。本文给大家分享Python实现DBSCAN聚类算法并样例测试,感兴趣的朋友一起看看吧
    2021-06-06
  • Python数据处理的三个实用技巧分享

    Python数据处理的三个实用技巧分享

    数据处理无所不在,掌握常用技巧,事半功倍。这篇文章将使用Pandas开展数据处理分析,总结其中常用、好用的数据分析技巧,感兴趣的可以学习一下
    2022-04-04
  • Python中多线程thread与threading的实现方法

    Python中多线程thread与threading的实现方法

    这篇文章主要介绍了Python中多线程thread与threading的实现方法,很重要的应用,需要的朋友可以参考下
    2014-08-08
  • python模拟登陆、POST/GET请求方式

    python模拟登陆、POST/GET请求方式

    这篇文章主要介绍了python模拟登陆、POST/GET请求方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • pycharm远程连接服务器运行pytorch的过程详解

    pycharm远程连接服务器运行pytorch的过程详解

    这篇文章主要介绍了在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorch的过程,包括安装PyTorch、CUDA以及配置PyCharm远程开发环境的详细步骤,需要的朋友可以参考下
    2025-02-02
  • 总结python爬虫抓站的实用技巧

    总结python爬虫抓站的实用技巧

    很多人学用python,用得最多的还是各类爬虫脚本:有写过抓代理本机验证的脚本,有写过自动收邮件的脚本,还有写过简单的验证码识别的脚本,那么我们今天就来总结下python爬虫抓站的一些实用技巧。
    2016-08-08
  • Python中实现定时任务常见的几种方式

    Python中实现定时任务常见的几种方式

    在Python中,实现定时任务是一个常见的需求,无论是在自动化脚本、数据处理、系统监控还是其他许多应用场景中,Python提供了多种方法来实现定时任务,包括使用标准库、第三方库以及系统级别的工具,本文将详细介绍几种常见的Python定时任务实现方式
    2024-08-08
  • python中使用requests设置代理服务器

    python中使用requests设置代理服务器

    文章介绍了代理服务器的工作原理和使用方法,包括代理的概念、代理服务器的作用、如何在Python中设置代理以及代理的匿名度分类
    2024-11-11

最新评论