1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import inspect def f(a,b,c = 1 ): pass f_sig = inspect.signature(f) print (f_sig) #(a, b, c=1) print (f_sig.parameters) #OrderedDict([('a', <Parameter "a">), ('b', <Parameter "b">), ('c', <Parameter "c=1">)]) print (f_sig.parameters[ 'a' ]) #a print (f_sig.parameters[ 'a' ].name) #a print (f_sig.parameters[ 'a' ].kind) #POSITIONAL_OR_KEYWORD print (f_sig.parameters[ 'a' ].default) #<class 'inspect._empty'> print (f_sig.parameters[ 'c' ].default) #1 bind_arguments = f_sig.bind( int , str , int ) print (bind_arguments) #<BoundArguments (a=<class 'int'>, b=<class 'str'>, c=<class 'int'>)> print (bind_arguments.arguments) #OrderedDict([('a', <class 'int'>), ('b', <class 'str'>), ('c', <class 'int'>)]) #绑定部分参数 bind_arguments = f_sig.bind_partial( int , list ) print (bind_arguments) #<BoundArguments (a=<class 'int'>, b=<class 'list'>)> print (bind_arguments.arguments) #OrderedDict([('a', <class 'int'>), ('b', <class 'list'>)]) |
inspect.signature函数返回一个inspect.Signature对象,它有一个parameters属性,这是一个有序映射,把参数名和inspect.Parameter对象对应起来,各个Paramters属性他有自己的属性,例如name,default,kind,特殊的inspect._empty值表示没有默认值,kind属性的值是_ParameterKind类中的5个之一,
POSITIONAL_OR_KEYWORD 可以通过定位参数和关键字参数传入的形参
VAR_POSITIONAL定位参数元组
VAR_KEWORD关键字参数字典
KEYWORD_ONLY仅限关键字参数
POSITIONAL_ONAL仅限定位参数
带参数的装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import inspect def type_assert( * ty_args, * * ty_kwargs): def decorator(func): func_sig = inspect.signature(func) bind_type = func_sig.bind_partial( * ty_args, * * ty_kwargs).arguments def wrap( * args, * * kwargs): for name,obj in func_sig.bind( * args, * * kwargs).arguments.items(): type_ = bind_type.get(name) if type_: if not isinstance (obj,type_): raise TypeError( '%s must be %s' % (name,type_)) return func( * args, * * kwargs) return wrap return decorator @type_assert ( int , list , str ) def f(a,b,c): pass f( 5 ,[], 'abc' ) # f(5,10,'abc')#TypeError: b must be <class 'list'> @type_assert (c = str ) def f(a,b,c): pass f([],[], 5.6 ) #TypeError: c must be <class 'str'> |
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/articles/10665763.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能