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__オブジェクトの属性の1つとしてリストされていないので、頭を悩ませています。

アップデート

そして、ここmatchobject.reにPython 2.6.1ドキュメントに存在する証拠があります:http: //docs.python.org/release/2.6.1/library/re.html#re.MatchObject.re

4

2 に答える 2

2

この動作は、クラスがCで実装されているために見られます。またdir()、カスタム__getattr__()で信頼できないのと同じように、Cコードでgetattr関数を定義している場合も信頼できません。

SRE_Matchgetattr関数のPython2.6Cコードへのリンクは次のとおりです。

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

match_methods配列で定義されたメソッドにはPython実装があり、dir()出力には表示されますがifmatch_getattr()関数内で処理されたメソッドは表示されないことに注意してください。

Python 2.6では、これには次の属性が含まれているように見えます:lastindex、lastgroup、string、regs、re、pos、およびendpos。

これは、わずかに異なるPython2.7コードの一部へのリンクです。ここでは、SRE_Matchに実装されたgetattr関数はなく、すべてのメソッドと属性は、、、および配列にあり、すべてがに表示されmatch_methodsます。match_membersmatch_getsetdir()

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 に答える