1. 程式人生 > >【Python】【有趣的模組】【from inspect import Signature】【獲取引數資訊】

【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'