Python是一门弱类型语言,很多从C/C++转过来的朋友起初不是很适应。比如,在声明一个函数时,不能指定参数的类型。用C做类比,那就是所有参数都是void*类型!void类型强制转换在C++中被广泛地认为是个坏习惯,不到万不得已是不会使用的。

Python自然没有类型强制转换一说了,因为它是动态语言。首先,所有对象都从Object继承而来,其次,它有强大的内省,如果调用某个不存在的方法会有异常抛出。大多数情况,我们都不需要做参数类型栓查,除了一些特殊情况。例如,某个函数接受一个str类型,结果在实际调用时传入的是unicode,测试过程中又没有代码覆盖到,这样问题就比较严重了。解决方法也很简单,借助Python的内省,很容易就能判断出参数的类型。但是每个地方都写检查代码会很累赘,何况它带来的实际价值并不高。一个好的解决方法是使用装饰器。

'''

>>> NONE, MEDIUM, STRONG = 0, 1, 2

>>>

>>> @accepts(int, int, int)

... def average(x, y, z):

... return (x + y + z) / 2

...

>>> average(5.5, 10, 15.0)

TypeWarning: 'average' method accepts (int, int, int), but was given

(float, int, float)

15.25

'''

def accepts(*types, **kw):

""" Function decorator. Checks that inputs given to decorated function

are of the expected type.

Parameters:

types -- The expected types of the inputs to the decorated function.

Must specify type for each parameter.

kw -- Optional specification of 'debug' level (this is the only valid

keyword argument, no other should be given).

debug = ( 0 | 1 | 2 )

"""

if not kw:

# default level: MEDIUM

debug = 1

else:

debug = kw['debug']

try:

def decorator(f):

def newf(*args):

if debug == 0:

return f(*args)

assert len(args) == len(types)

argtypes = tuple(map(type, args))

if argtypes != types:

msg = info(f.__name__, types, argtypes, 0)

if debug == 1:

print >> sys.stderr, 'TypeWarning: ', msg

elif debug == 2:

raise TypeError, msg

return f(*args)

newf.__name__ = f.__name__

return newf

return decorator

except KeyError, key:

raise KeyError, key + "is not a valid keyword argument"

except TypeError, msg:

raise TypeError, msg

def info(fname, expected, actual, flag):

""" Convenience function returns nicely formatted error/warning msg. """

format = lambda types: ', '.join([str(t).split("'")[1] for t in types])

expected, actual = format(expected), format(actual)

msg = "'%s' method " % fname \

+ ("accepts", "returns")[flag] + " (%s), but " % expected\

+ ("was given", "result is")[flag] + " (%s)" % actual

return msg

python函数参数类型检查_Python中实现参数类型检查的简单方法相关推荐

  1. python函数type的用意_python中type()是什么意思

    type()是一个内建的获取变量类型的函数. type()函数有两个用法,当只有一个参数的时候,返回对象的类型.当有三个参数的时候返回一个类对象. 语法:type(object) type(name, ...

  2. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  3. python定义一个复数类_Python中complex复数类型的简单介绍

    1 复数的简要描述 虚数由实部和虚部两个部分构成: real+imag(虚部后缀为j或J) 其中实数部分和虚数部分都为浮点数.  例如定义一个虚数,分别输出它的实部和虚部: a=4.7+0.666j  ...

  4. 关于python语言的变量随时_Python中变量的类型是动态的,随时可以变化

    Python中变量的类型是动态的,随时可以变化 答:√ 下列关于普通用户实现任务计划的描述,错误的是:(? ?) 答:普通用户可通过修改/etc/crontab文件制定任务计划 下列哪些属于人民战争的 ...

  5. python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍

    本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用S ...

  6. python函数type的用意_Python中type的构造函数参数含义说明

    测试代码如下: 复制代码 代码如下: class ModelMetaClass(type): def __new__(cls,name,base,attrs): logging.info(" ...

  7. python函数打印乘法表_Python中内置函数来打印数学乘法表

    1.Python内置函数range的使用 range函数的作用可以理解取一个范围如下: >>>range(5) # :取一个在5的范围>range(0, 5) # 那么在这里取 ...

  8. python函数拟合不规则曲线_python中的多变量(多项式)最佳拟合曲线?

    接受的答复 this question 提供了 a small multi poly fit library,它将使用numpy完成所需的任务,您可以将结果插入到绘图中,如下所述. 您只需将x和y点的 ...

  9. python 数字类型判断_Python中 各种数字类型的判别(numerica, digital, decimal)

    一. 全角和半角 全角:是指一个全角字符占用两个标准字符(或两个半角字符)的位置.全角占两个字节.汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符.在全角中,字 ...

最新文章

  1. rbac权限管理 php,thinkPHP3.2使用RBAC实现权限管理的实现
  2. 独家下载!2021前端热门技术解读
  3. zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)...
  4. 组合数学基本工具-- 排列与组合以及简单公式
  5. python数据科学实践 常象宇_Python数据科学实践
  6. 局域网聊天软件的设计思路
  7. C语言丨函数的递归调用和递归函数
  8. 微信支付 支付成功后不跳转 ecshop微信支付 如下操作即可
  9. Latex格式投稿需注意的问题_以BSPC和BMC BioInformatics为例
  10. 在线Excel的前端组件、控件,实现web Excel
  11. 【广告计算】互联网控制舆论的三个方法
  12. Apple开启双重认证过程
  13. OpenSSL生成.key、.crt、.pfx证书(Windows下)
  14. 杰理之高低速(HSB/LSB)时钟硬件模块【篇】
  15. win10系统地图无法定位服务器,Win10无法启用定位功能(灰色)解决办法
  16. python3爬虫系列21之selenium自动化登录163邮箱并读取未读邮件内容
  17. Python笔记2_替换式文本加密
  18. Data transformation R语言与python
  19. 山西大同大学技术会,大同大学的家!
  20. HDU 2681 MM Programming Club(miaos的线段树维护+ycy的暴力贪心)

热门文章

  1. Kubernetes攻略之新手上路
  2. 解决vs2019中暂时无法为.net core WinForms使用 Designer 的临时方法
  3. 利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务
  4. Docker最全教程——数据库容器化(十一)
  5. 来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
  6. .NET Framework 4.7发布,支持Windows 10创作者更新
  7. CentOS上安装SQL Server vNext CTP1
  8. 值得推荐的微软技术公众号推荐
  9. php自动加载机制的实现
  10. 投巧解决JavaScript split方法出现空字符的问题