這個程式相對複雜了點,先看程式
def info(object, spacing = 10, collapse = 1): """Print methods and doc strings. Takes modules, class, list, dictionary, or string.""" methodList = [method for method in dir(object) if hasattr(getattr(object, method), '__call__')] processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) print("\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object,method).__doc__))) for method in methodList]))if __name__ == "__main__": print(info.__doc__)
這裡我都做了一點變化來適應python 3的程式
需要注意幾點:
python 3裡不支援這個全域函數 callable了
callable()
global function
In Python 2, you could check whether an object was callable (like a function) with the global callable()
function. In Python 3, this global function has been eliminated. To check whether an object is callable, check for the existence of the __call__()
special method.
python 2 : callable(anything)
python 3: hasattr(anything, '__call__')
對於這一句的理解
processFunc = collapse and (lambda s : " ".join(s.split())) or (lamdba s : s)
幾個知識點:
一, and
python 裡面為false的只有這幾個 0,"", [], (), {} 其他都為true 所以這裡的匿名函式自然也是true。 有多個一起進行and操作的時候,如果都為真,則返回最後一個。
二, split()函數
split()不帶參數,它按空白進行分割
三, lambda函數
lambda函數用於進行快速定義函數 下面的是等價的
def f(x):
return x*2
f(2)
這個等價於:
g = lambda x : x*2
g(2)
或者 (lambda x: x*2)(2)
processFunc的作用現在就看的很明白了。如果collapse為true,則將processFunc(string)裡面的string 壓縮空白, 如果collapse為false, 則直接返回不改變的參數。
解釋下面這句:
print("\n".join(["%s %s" %(method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList]))
這個裡面有幾個知識點:
一,ljust()函數
用空格填充字串以符合指定長度
二, str(getattr(object, method).__doc__)
如果method沒有定義doc屬性,是得不到一個None值的,但是用str()方法就可以得到一個None。
在研究下一章前,確保你可以無困難的完成下面這些事情:
•用可選和具名引數定義和調用函數
•用 str 強制轉換任意值為字串形式
•用 getattr 動態得到函數和其它屬性的引用
•擴充列表解析文法實現 列表過濾
•識別 and-or 技巧 並安全的使用它
•定義 匿名函式
•將函數賦值給變數 然後通過引用變數調用函數。