Python中实现参数类型检查的简单方法
来源: 阅读:2454 次 日期:2015-04-24 09:43:51
温馨提示: 小编为您整理了“Python中实现参数类型检查的简单方法”,方便广大网友查阅!

这篇文章主要介绍了Python中实现参数类型检查的简单方法,本文讲解使用装饰器实现参数类型检查并给出代码实例,需要的朋友可以参考下

  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

本质上讲,这也是一种运行时检查,但效果已经不错了。

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map