前言
说明
在python中,即使加入了类型注解
,使用注解之外的类型也是不报错
的
def test ( uid: int ) :
print ( uid)
test( "999" )
但是我就想要类型不对
就直接报错 确实可以另辟蹊径,实现报错
,似乎有强类型语言
那味了 只想淡淡的说一句装饰器
yyds
代码实现
import inspect
def type_check ( func) :
def wrapper ( * args, ** kwargs) :
sig = inspect. signature( func)
bound_args = sig. bind( * args, ** kwargs)
bound_args. apply_defaults( )
for name, value in bound_args. arguments. items( ) :
param = sig. parameters[ name]
expected = param. annotation
default_value = param. default
if default_value != inspect. Parameter. empty:
print ( '有默认值 => {}实际值={}' . format ( name, value) )
else :
print ( '无默认值 => {}' . format ( name) )
if expected != inspect. Parameter. empty:
if default_value == inspect. Parameter. empty:
if not isinstance ( value, expected) :
raise TypeError( f"参数' { name} '应该是 { expected} 而不是 { type ( value) } " )
if value != default_value and not isinstance ( value, expected) :
raise TypeError( f"参数' { name} '应该是 { expected} 而不是 { type ( value) } " )
return func( * args, ** kwargs)
return wrapper
开始表演
@type_check
def demo ( n: int , msg: str , state: int = None ) :
print ( '正常结束\n' )
demo( 1 , 'SUCCESS' )
demo( 2 , 'SUCCESS' , 200 )
demo( 3 , 'FAILED' , '哈哈' )
demo( '4' , "FAILED" , '嘻嘻' )
输出结果