以下是一些示例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.re
:
http://docs.python.org/release/2.6.1/library/re.html#re.MatchObject.re
答案 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_methods
,match_members
和match_getset
数组中找到,所有内容都在{{1}中可见}。
http://hg.python.org/cpython/file/60a7b704de5c/Modules/_sre.c#l3612
答案 1 :(得分:1)
内置函数dir()
是一个便利函数,它会生成一个近似的属性列表。来自documentation:
因为
dir()
主要是为了方便在交互式提示中使用而提供的,所以它试图提供一组有趣的名称,而不是尝试提供严格或一致定义的名称集,以及它的详细行为可能会在不同的版本例如,当参数是类时,元类属性不在结果列表中。
请注意,不可能始终提供完整的属性列表,因为类可以在__getattr__()
和__getattribute__()
方法中执行,无论他们想要什么。