• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
inspect提取函数签名
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仅限定位参数

 

 带参数的装饰器

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

posted on 2019-04-07 16:11  孙龙-程序员  阅读(656)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3