2017-07-25 14 views
0

これは奇妙に見えます。 クラスという名前の変数が出力されますが、filter(...)の命令を実行しようとすると、未定義です。ここでPDB:変数は印刷できますが、定義されていません

はコードです:

def start(self, tag, attrib): 
    classes = attrib[self._CLASS_ATTR] if self._CLASS_ATTR in attrib else None 

    if tag == self._TAG_P: 
     p = self._doc.add_paragraph('') 

     self._cur_p = p 

     if classes is not None: 
      alignments = [self._left_align, self._center_align, self._right_align] 
      import pdb; pdb.set_trace() 
      alignments = filter(lambda x: partial(x.is_in, classes), alignments) 
      if len(alignments) > 0: 
       p.alignment = alignments[0].get() 

      assert len(alignments) < 2 

PDBがそれの休憩時間に停止します。 filter(...)命令が正常に実行できなかったのはなぜ

(Pdb) print classes 
center title 
(Pdb) classes 
u'center title' 

(Pdb) print filter(lambda x: partial(x.is_in, classes), alignments) 
*** NameError: global name 'classes' is not defined 

しかし:私はfilter()を実行しようとすると?

の短いコードでそれを再現してみましょう:

from functools import partial 

def f(): 
    classes = 'my_classes' 

    def my_bool(obj, _): 
     return True 

    if classes is not None: 
     import pdb; pdb.set_trace() # point a 
     alignments = filter(lambda x: my_bool(x, classes), ['1', '2', '3']) 
     import pdb; pdb.set_trace() # point b 
     pass 

f() 

... 

(Pdb) filter(lambda x: my_bool(x, classes), ['1', '2', '3']) 
*** NameError: global name 'my_bool' is not defined 

ただし、コマンドcは、例外が発生しない箇所aでのPDB(継続)。

+0

実際のコードでタイプミスがあり、この質問を投稿したときに気付かずにタイプミスが修正されたようです。 – user2357112

+0

( 'filter'は意味がありません。あなたの述語はブール値の代わりに' partial'オブジェクトを返します。) – user2357112

+0

@ user2357112こんにちは。それが私のコードの今のところです。 – sergzach

答えて

1

pdbは、evalループです。評価ループは基本的に、プロンプトに行ごとに書き込むものと、eval(...)です。つまり、定義された関数(lambdas)でクロージャスコープの変数をバインドしません。 eval(関数である)、独自のスコープを持っており、あなたが評価している閉鎖に参加しません

あなたは、このサンプルコードから同等の問題が確認できます。

def f(): 
    x = 1 
    return eval('lambda: x') 

>>> f()() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 1, in <lambda> 
NameError: name 'x' is not defined 

をアン(不幸)回避策は、どんなラムダをも前もって定義し、それらをあなたのpdb式で使うことです。

関連する問題