您当前位置:首页 > 深入 Python > 自省的强大功能 > 将所有内容整合在一起 | << >> | ||||
深入 Python从 Python 新手到专家 |
最后一行代码,也是您尚未拆解的唯一一行代码,是完成所有工作的代码。但现在工作变得容易了,因为您需要的一切都已经按照您需要的方式设置好了。所有的多米诺骨牌都已就位;是时候推倒它们了。
这是 apihelper.py 的核心部分
print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList])
请注意,这是一个命令,分为多行,但它没有使用行继续符 (\)。还记得我说过 某些表达式可以拆分为多行 而无需使用反斜杠吗?列表推导式就是其中一种表达式,因为整个表达式都包含在方括号中。
现在,让我们从最后开始,逆向分析。
for method in methodList
表明这是一个 列表推导式。如您所知,methodList 是 您关心的所有方法 在 object 中的列表。因此,您正在使用 method 遍历该列表。
>>> import odbchelper >>> object = odbchelper>>> method = 'buildConnectionString'
>>> getattr(object, method)
<function buildConnectionString at 010D6D74> >>> print getattr(object, method).__doc__
Build a connection string from a dictionary of parameters. Returns string.
![]() |
在 info 函数中,object 是您要获取帮助的对象,作为参数传入。 |
![]() |
当您遍历 methodList 时,method 是当前方法的名称。 |
![]() |
使用 getattr 函数,您将获得对 object 模块中 method 函数的引用。 |
![]() |
现在,打印方法的实际 文档字符串 就很容易了。 |
下一个难题是 文档字符串 周围使用 str。您可能还记得,str 是一个内置函数,用于将数据 强制转换为字符串。但 文档字符串 始终是一个字符串,为什么要使用 str 函数呢?答案是并非每个函数都有 文档字符串,如果没有,则其 __doc__ 属性为 None。
>>> >>> def foo(): print 2 >>> >>> foo() 2 >>> >>> foo.__doc__>>> foo.__doc__ == None
True >>> str(foo.__doc__)
'None'
![]() |
|
在 SQL 中,您必须使用 IS NULL 而不是 = NULL 来比较空值。在 Python 中,您可以使用 == None 或 is None,但 is None 更快。 |
现在您已经确定拥有一个字符串,您可以将该字符串传递给 processFunc,您已经将其 定义 为折叠或不折叠空格的函数。现在您明白为什么使用 str 将 None 值转换为字符串表示形式很重要。 processFunc 假定一个字符串参数并调用其 split 方法,如果您传递给它 None,它将会崩溃,因为 None 没有 split 方法。
再往回看,您会发现您再次使用字符串格式化将 processFunc 的返回值与 method 的 ljust 方法的返回值连接起来。这是一个您以前从未见过的新的字符串方法。
>>> s = 'buildConnectionString' >>> s.ljust(30)'buildConnectionString ' >>> s.ljust(20)
'buildConnectionString'
您快完成了。给定来自 ljust 方法的填充方法名称和来自对 processFunc 的调用的(可能已折叠的)文档字符串,您将两者连接起来并获得一个字符串。由于您正在映射 methodList,因此您最终会得到一个字符串列表。使用字符串 "\n" 的 join 方法,您可以将此列表连接成一个字符串,列表中的每个元素都在单独的行上,并打印结果。
这就是最后一个难题。您现在应该理解这段代码了。
print "\n".join(["%s %s" % (method.ljust(spacing), processFunc(str(getattr(object, method).__doc__))) for method in methodList])
<< 使用 lambda 函数 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
总结 >> |