当我在python中的匹配对象上执行dir()时,为什么不列出re属性?

时间:2012-06-13 17:58:04

标签: python regex attributes

以下是一些示例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__列为其中一个对象的属性也是如此,所以我一直在挠头。

更新

这里证明了Python 2.6.1文档中存在matchobject.rehttp://docs.python.org/release/2.6.1/library/re.html#re.MatchObject.re

2 个答案:

答案 0 :(得分:2)

您会看到此行为,因为该类是在C中实现的,并且与dir()与自定义__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()输出中可见,但由if函数中的match_getattr()处理不是可见。

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

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

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

答案 1 :(得分:1)

内置函数dir()是一个便利函数,它会生成一个近似的属性列表。来自documentation

  

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

请注意,不可能始终提供完整的属性列表,因为类可以在__getattr__()__getattribute__()方法中执行,无论他们想要什么。