《流畅的Python》示例5-17 提取函数的签名

发布时间 2023-09-20 19:31:29作者: limalove

理解param.kind含义:给形参传递参数的方式,是位置传递,还是关键字传递

 

 

 1 def clip(text,  max_len = 80):
 2     end = None
 3     if len(text) > max_len:
 4         space_before = text.rfind(" ", 0, max_len)
 5         if space_before >= 0 :
 6             end = space_before
 7         else:
 8             space_after = text.rfind(" ", max_len)
 9         
10         if space_after >= 0:
11             end = space_after
12         
13         if end is None:
14             end = len(text)
15             
16     return text[:end].rstrip(" ")
17 
18 
19 
20 # print(clip.__defaults__)
21 # print(clip.__kwdefaults__)
22 
23 # a = clip.__code__.co_varnames
24 # print(a)
25 # print(type(a))
26 # print(clip.__code__.co_argcount)
27 
28 
29 #和上面clip函数唯一的区别是参数中添加了/, *
30 def clip1(text, /,*,max_len = 80):
31     pass

 

 

 

 

from inspect import signature
from clip import clip, clip1

sig = signature(clip)
sig1 = signature(clip1)
print(sig)
print(str(sig))
print("sig.parameters:\n",sig.parameters, '\n')
print('sig.parameters.items():\n',sig.parameters.items(), '\n')
print('sig.parameters.keys():\n',sig.parameters.keys(), '\n')
print('sig.parameters.values():\n',sig.parameters.values(), '\n')

for i in sig.parameters.values():
    print("parameter对象类型:",type(i))    #<class 'inspect.Parameter'>
print(" ")


#以下两种对比param.kind返回值
print("clip函数的param.kind值:")
for name, param in sig.parameters.items():
    print(param.kind, ':', name,"=", param.default ,',',param.annotation  )


print("\nclip1函数的param.kind值:")

for name1, param1 in sig1.parameters.items():
    print(param1.kind , ':', name ,"=", param1.default  )