网站模板在线制作,湘潭做网站价格咨询磐石网络,温州创荣网络科技有限公司,网站防注入Python是一门弱类型语言#xff0c;很多从C/C转过来的朋友起初不是很适应。比如#xff0c;在声明一个函数时#xff0c;不能指定参数的类型。用C做类比#xff0c;那就是所有参数都是void*类型#xff01;void类型强制转换在C中被广泛地认为是个坏习惯#xff0c;不到万…Python是一门弱类型语言很多从C/C转过来的朋友起初不是很适应。比如在声明一个函数时不能指定参数的类型。用C做类比那就是所有参数都是void*类型void类型强制转换在C中被广泛地认为是个坏习惯不到万不得已是不会使用的。
Python自然没有类型强制转换一说了因为它是动态语言。首先所有对象都从Object继承而来其次它有强大的内省如果调用某个不存在的方法会有异常抛出。大多数情况我们都不需要做参数类型栓查除了一些特殊情况。例如某个函数接受一个str类型结果在实际调用时传入的是unicode测试过程中又没有代码覆盖到这样问题就比较严重了。解决方法也很简单借助Python的内省很容易就能判断出参数的类型。但是每个地方都写检查代码会很累赘何况它带来的实际价值并不高。一个好的解决方法是使用装饰器。NONE, MEDIUM, STRONG 0, 1, 2accepts(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.25def 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