1

(だから私はPythonを学ぼうとしています。私よりも人がコードを読むのが良いと思いました。私は電子メールモジュールを読むことにしました...)

initモジュール内のFeedparserクラスの関数は、次のemail.feedparserように定義されています。

def __init__(self, _factory=message.Message):
    """_factory is called with no arguments to create a new message obj"""
    self._factory = _factory
    self._input = BufferedSubFile()
    self._msgstack = []
    self._parse = self._parsegen().next
    self._cur = None
    self._last = None
    self._headersonly = False

私が問題を抱えている行は次のとおりです。

self._parse = self._parsegen().next

これは、'メソッドの戻り値の属性のself._parse値に属性を設定することを意味すると思いますnextself._parsegen()

私の知る限り、self._parsgen()中に呼び出されると、__init__()最初に呼び出され、、、、およびself._new_message()に値が設定/追加されます。次に、空のリストオブジェクトをローカル変数に割り当て、オブジェクトの反復を開始します。の最初の値はオブジェクトになると思います。クラスはオブジェクトを拡張するだけなので、 。という名前の属性やメソッドはありません。では、イテレータ()を参照するだけですか?self._curself._lastself._msgstackheadersself._inputlineNeedMoreDataNeedMoreDatanextnextself._input

スクリプトの各行をステップスルーできるように、インタープリターでこれを確認する方法はありますか?

4

2 に答える 2

4

ではnext、イテレータ(self._input)を参照するだけですか?

nextジェネレータを参照します。この_parsegen()メソッドはを使用するためyield、ジェネレータオブジェクトを返します。次の簡単な例(IPythonから)を考えてみましょう。

In [1]: def a():
   ...:     yield 1
   ...:     yield 2
   ...:     

In [2]: a()
Out[2]: <generator object a at 0x1a56550>

In [3]: a().next
Out[3]: <method-wrapper 'next' of generator object at 0x1a567d0>

In [4]: a().next()
Out[4]: 1

だから、はい、あなたはほとんど正しいです。イテレータにフォールダウンし、メソッドを参照して次の値を返します。

スクリプトの各行をステップスルーできるように、インタープリターでこれを確認する方法はありますか?

そのためにpdbを使用できます。

于 2012-08-23T22:29:41.343 に答える
2

このメソッドは、Pythonまたはnextの次の値を生成する方法です。これについて考える最も簡単な方法は、forループを書き直すことです。iteratorgenerator

リストをループするための非常に簡単な構文があります。

for element in list:
    print element 

elementこれにより、反復ごとにが生成されます。しかし、内部では、Pythonは実際にこれに似た何かをしています:

iterator = iter(list)
while True:
    element = iterator.next()
    # do something with element (e.g. print it)
    print element

イテレータが使い果たされると(アイテムがなくなると)、StopIteration例外が発生します。これは、forループやイテレータを使用する他のメソッドがいつ停止するかを知る方法です。(したがって、前のコードスニペットは実際にはブロックでラップする必要がありますがtry/except、それがないと読む方が明確になると思いました)。

イテレータのプロトコルについては、Pythonのドキュメントをご覧ください。__iter__(ただし、とを定義および生成するイテレータを定義および生成する__iter__場合 、基本的には何でもイテレータになることができますnext

于 2012-08-23T22:30:04.843 に答える