2

这是一些示例 Python 代码:

import re
some_regex = re.compile(r"\s+1\s+")
result = some_regex.search(" 1 ")
dir(result)

我使用 Python 2.6.1 返回以下内容:

 ['__copy__', '__deepcopy__', 'end', 'expand', 'group', 'groupdict', 'groups', 'span', 'start']

然而result.re存在(来自解释器):

>>> result.re
<_sre.SRE_Pattern object at 0x10041bc90>

dir()使用函数时如何不列出属性?

此页面确认re属性的存在:

http://docs.python.org/library/re.html#re.MatchObject.re

现在我明白了,如果一个人试图访问一个未通过 列出的属性dir(),那么__getattr__就会被调用,但我也没有看到__getattr__列为对象的属性之一,所以我只能摸不着头脑。

更新

这里是matchobject.rePython 2.6.1 文档中存在的证明:http: //docs.python.org/release/2.6.1/library/re.html#re.MatchObject.re

4

2 回答 2

2

您会看到这种行为,因为该类是在 C 中实现的,并且dir()与 custom 不可靠的方式相同,__getattr__()当 C 代码定义 getattr 函数时它也是不可靠的。

这是 SRE_Match getattr 函数的 Python 2.6 C 代码的链接:

http://hg.python.org/cpython/file/f130ce67387d/Modules/_sre.c#l3565

请注意,match_methods数组中定义的方法具有 Python 实现并且在dir()输出中可见,但由函数中的 an 处理ifmatch_getattr()不可见的。

在 Python 2.6 中,它看起来包括以下属性:lastindex、lastgroup、string、regs、re、pos 和 endpos。

这是一些 Python 2.7 代码的链接,它略有不同。这里没有为 SRE_Match 实现 getattr 函数,所有方法和属性都可以在match_methodsmatch_membersmatch_getset数组中找到,所有内容都可以在dir().

http://hg.python.org/cpython/file/60a7b704de5c/Modules/_sre.c#l3612

于 2012-06-13T18:25:01.100 回答
1

内置函数dir()是一个便利函数,会生成一个近似的属性列表。从文档中:

因为dir()主要是为了方便在交互式提示中使用而提供的,所以它尝试提供一组有趣的名称,而不是尝试提供一组严格或一致定义的名称,并且它的详细行为可能会随版本而变化。例如,当参数是类时,元类属性不在结果列表中。

请注意,不可能总是给出完整的属性列表,因为类可以在其__getattr__()__getattribute__()方法中做任何他们想做的事情。

于 2012-06-13T18:00:47.100 回答