文档章节

【Python】使用装饰器为Python实现运行时类型检查

duyixian1234
 duyixian1234
发布于 2016/09/10 14:49
字数 283
阅读 23
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

背景

闲来无事想熟悉一下Python的装饰器写法,就写了一个简单的类型检查装饰器。

思路

利用带参数的装饰器直接传入变量的预期类型,然后使用isinstance检查类型。

代码

def typeLimits(*types, **typesdict):
    def desc(func):
        def f(*args, **kwargs):
            for i, v in enumerate(types):
                if not isinstance(args[i], v):
                    raise Exception("Need a {} where {} is not.".format(v.__name__, args[i]))
            for parm in typesdict:
                if kwargs.get(parm, None) is None:
                    raise Exception("Need parameter {}.".format(parm))
                if not isinstance(kwargs[parm],typesdict[parm]):
                    raise Exception('Need a {} for {} where {} is not.'.format(typesdict[parm].__name__, parm, kwargs[parm]))
            return func(*args, **kwargs)
        return f
    return desc

@typeLimits(int, str)
def printOneIntAndOneString(n, s):
    print(n ** 2, s.upper())

@typeLimits(int, name = str)
def printOneIntAndName(n, name):
    print(n + n, name.upper())

printOneIntAndOneString(1,'abc') # 正确执行

# printOneIntAndOneString(1 + 2,3 + 4) 报错

printOneIntAndName(1, name = "aaa") 正确执行

# printOneIntAndName(1) 报错

# printOneIntAndName(1, name = 2.0) 报错

感想

这只是一个游戏之作,检查类型会耗费一些性能,真正部署运行的项目是不需要类型检查的,但可以在测试的时候使用类型检查来避免一些无谓的错误。
duyixian1234
粉丝 0
博文 7
码字总数 2707
作品 0
杭州
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.7K
0
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16

没有更多内容

加载失败,请刷新页面

加载更多

Vue视频播放器 vue-video-player

Vue视频播放器 vue-video-player 本篇主要记录一下 在 vue 项目中 如何使用 vue-video-player 来作为视频播放器,由于最近在做博客的 轻松一刻模块 所以拿这个尝试一下 在此纪录一下 以及遇到...

AskaJohnny
5分钟前
0
0
Python是什么,Python语言及其特点简介

虽然软件产业的历史相对于人类历史只是白驹过隙,但世界上却存在非常多的编程语言,「Python」 就是其中之一。 Python 语言算得上一门“古老”的编程语言,Python 流行这么久,必然有它的独到...

前端老司机
13分钟前
11
0
serve 和 hhtp-server 对比

两个都是一个静态资源工具 npm i serve http-server -g https://github.com/http-party/http-server#readme https://github.com/vercel/serve#readme 由于遇到了cors问题, 目前选择http-se......

阿豪boy
15分钟前
8
0
java开发之阿里云接口发送短信验证码

随着互联网的兴起,各行各业的需求都在不断的增加。随着业务的扩大,企业给用户发送短信验证码的业务,也是如火如荼。在这里,calvin给各位开发者推荐阿里云短信平台。原因有二:1.接入较简单...

Arisono
25分钟前
9
0
如何从我的应用程序在Android的网络浏览器中打开URL? - How can I open a URL in Android's web browser from my application?

问题: How to open an URL from code in the built-in web browser rather than within my application? 如何通过内置Web浏览器而不是应用程序中的代码打开URL? I tried this: 我尝试了这个...

javail
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部