#!/usr/bin/env python
# -*- coding: utf-8 -*-
import string
def info(object):
'''"Print methods and doc strings.
Takes module, class, l ist, dictionary, or string.'''
methodlist = [method for method in dir(object) if callable(getattr(object, method))]
methodlist.sort(reverse=True)
for m in methodlist:
print '################################################'
print '%s%s' % (m.ljust(20), getattr(object, m).__doc__)
if __name__ == '__main__':
info(string)
info 函数的设计意图是提供给工作在 Python IDE 中的开发人员使用,它可以接受任何含有函数或者方法的对象 (比如模块,含有函数,又比如list,含有方法) 作为参数,并打印出对象的所有函数和它们的 doc string。
自省的核心:
1. getattr(object,name) 返回指定对象的指定属性的函数引用
2. and - or 的使用技巧
and 取第一个假值, 如果表达式全部为真,则去的是最后一个真元素: 如
>>> 'a' and 'b'
'b'
>>> '' and 'b'
''
>>> 'a' and 'b' and [] and 'c'
[]
>>>
or 取第一个真值, 如果表达式全部为假,则去的是最后一个假元素: 如
>>> 'a' or 'b'
'a'
>>> '' or 'b'
'b'
>>> 'a' or 'b' or [] or '' or 'c'
'a'
>>> '' or [] or {} or () or 'a' or 'b'
'a'
>>> '' or []
[]
and 和 or一起使用,表示 bool ? a : b
>>> 1==1 and 'a' or 'b'
'a'
>>> 1!=1 and 'a' or 'b'
'b'
问题在于,当返回值需要空值时出现混乱:
>>> 1==1 and '' or 'b'
'b'
目的在于返回 '' 空字符串, 显然不是我们想要的值
解决:
>>> (1==1 and [''] or ['b'])[0]
''
使用列表包装选项值,使用元组存返回值,然后取元组第一个值
一般用于 lambda 函数中