Python ';x';在ipdb中使用列表理解时未定义

Python ';x';在ipdb中使用列表理解时未定义,python,pdb,Python,Pdb,我曾经尝试过这段代码,但出于某种原因,它认为ast没有定义,即使在导入之后也是如此。如何避免这种情况?好吧,我找到了一种方法,但这很烦人 首先,发生这种情况是因为列表理解有它自己的范围,所以它们不在(i)pdb中工作。有关更多信息,请参阅: 解决方案是使用map+lambda模拟列表理解,我可以通过 ipdb> import ast ipdb> [t.unparse() if isinstance(t, ast.AST) else t for t in tree] *** NameE

我曾经尝试过这段代码,但出于某种原因,它认为ast没有定义,即使在导入之后也是如此。如何避免这种情况?

好吧,我找到了一种方法,但这很烦人

首先,发生这种情况是因为列表理解有它自己的范围,所以它们不在(i)pdb中工作。有关更多信息,请参阅:

解决方案是使用map+lambda模拟列表理解,我可以通过

ipdb> import ast
ipdb> [t.unparse() if isinstance(t, ast.AST) else t for t in tree]
*** NameError: name 'ast' is not defined
,因为
列表
是pdb中的一个关键字

它会变得更好 看到这个了吗

您可以在会话开始时键入
interact
,使您的
ipdb
会话具有交互性,而不是使用globals

现在你可以继续你原来的样子了,一切都会好起来的

更好的解决方案 将模块拉入全局范围

!list(map((lambda t: t if type(t) is str else t.unparse()), tree))

试着从ast导入一个相同的问题,事实上这是由于列表生成器有它自己的范围,我发现了一个丑陋的解决方案这回答了你的问题吗?另一种解决方案是创建一个引用
ast
的全局变量,然后使用该全局变量。看看我的嗯,谢谢,我会试试的:)
ipdb>  import ast
ipdb>  global ast # <-- This
ipdb>  [t.unparse() if isinstance(t, ast.AST) else t for t in tree]
ipdb>  import ast
ipdb>  AST=ast.AST
ipdb>  [t.unparse() if isinstance(t, AST) else t for t in tree]