【Python】【有趣的模块】【from inspect import Signature】【获取参数信息】

"""

练习1

rfind 返回最后次出现的位置,参数一是开始查找位置,参数二是结束查找位置

str1 = 'admin minad entend'
print(str1.rfind(' ',0,6)) #5
print(str1.rfind(' ',0,2)) #-1
print(str1.rfind(' ',2)) #11
print(str1.find(' ',2)) #5

print(str1[:5].rstrip()) #admin
"""

练习2

def clip(text,max_len=80):
'''在max_len前面或后面的第一个空格处截断文本,前面有则从前面的空格处截断,前面没有则从后面的空格处截断'''
end = None
if len(text) > max_len:
space_before = text.rfind(' ',0,max_len)
if space_before > 0:
end = space_before
else:
space_after = text.find(' ',max_len)
if space_after > 0:
end = space_after
if end is None:
end = len(text)
return text[:end].rstrip()

提取关于函数参数的信息

print(clip.__defaults__) #(80,)
print(clip.__code__) #<code object clip at 0x0000000001DA5930, file "C:/Users/wangxue1/PycharmProjects/python2/methodIsObj/init.py", line 13>
print(clip.__code__.co_varnames) #('text', 'max_len', 'end', 'space_before', 'space_after')
print(clip.__code__.co_argcount) #2

提取函数的签名

from inspect import signature
sig = signature(clip)
print(sig) #(text, max_len=80)
print(str(sig)) #(text, max_len=80)
for name,param in sig.parameters.items():
print(param.kind,':',name,'=',param.default)
'''
POSITIONAL_OR_KEYWORD : text = <class 'inspect._empty'>
POSITIONAL_OR_KEYWORD : max_len = 80
'''

【备注】

'''
kind 属性的值是 _ParameterKind 类中的 5 个值之一,列举如下。
POSITIONAL_OR_KEYWORD
  可以通过定位参数和关键字参数传入的形参(多数 Python 函数的参数属于此类)。
VAR_POSITIONAL
  定位参数元组。
VAR_KEYWORD
  关键字参数字典。
KEYWORD_ONLY
  仅限关键字参数(Python 3 新增)。
POSITIONAL_ONLY
  仅限定位参数;目前, Python 声明函数的句法不支持,但是有些使用 C 语言实现且
不接受关键字参数的函数(如 divmod)支持
'''

吧tag函数的签名绑定到一个参数字典上

...准备工作

def tag(name,*content,cls=None,**attrs):
if cls is not None:
attrs['class'] = cls
if attrs:
attr_str = ''.join()
attrs = {'class':'sidebar'}
print('%s="%s' % (attr,value) for attr,value in sorted(attrs.items())) #<generator object

...tag函数

def tag(name,*content,cls=None,**attrs):
'''生成一个或多个HTML标签'''
if cls is not None:
attrs['class'] = cls
if attrs:
attr_str = ''.join(' %s="%s' % (attr,value) for attr,value in sorted(attrs.items()))
else:
attr_str = ''
if content:
return '\n'.join('<%s%s>%s</%s>' % (name,attr_str,c,name) for c in content)
else:
return '<%s%s />' % (name,attr_str)

sig = signature(tag)
my_tag = {'name':'img','title':'Sunset Boulevard','src':'sunset.jpg','cls':'framed'}
bound_args = sig.bind(**my_tag)
print(bound_args) #<BoundArguments (name='img', cls='framed', attrs={'title': 'Sunset Boulevard', 'src': 'sunset.jpg'})>
for name,value in bound_args.arguments.items():
print(name,'=',value)
'''
name = img
cls = framed
attrs = {'title': 'Sunset Boulevard', 'src': 'sunset.jpg'}
'''

del my_tag['name']

bound_args = sig.bind(**my_tag) #TypeError: missing a required argument: 'name'

猜你喜欢

转载自www.cnblogs.com/suren2017/p/10220022.html