在 Python 中调试时,什么是“__getattr__”,如何避免?
When debugging in Python, what is "__getattr__" and how can I avoid it?
假设我想进入我的函数:
-> gene_signature = GeneSignature.from_geo(request.form)
(Pdb) s
接下来我总是得到的是:
--Call--
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(335)__getattr__()
-> def __getattr__(self, name):
(Pdb) n
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(336)__getattr__()
-> if name == '__members__':
(Pdb) n
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(338)__getattr__()
-> return getattr(self._get_current_object(), name)
(Pdb) n
--Return--
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(338)__getattr__()->Immutabl...iDict([])
-> return getattr(self._get_current_object(), name)
(Pdb) n
仅在这些步骤之后我得到:
--Call--
> ../model/genesignature.py(72)from_geo()
-> @classmethod
发生什么事了?我可以避免单步执行这个中间代码吗?
两件事:
__getattr__
是内置的、可重写的方法,用于访问对象的属性。
您可以避免在调试器中使用 n
而不是 s
进入 "intermediate code" (您在第一次之后执行此操作但不是第一次,所以它 "steps" 进入这个调用。)
编辑添加:听起来你此时在 n
和 s
之间左右为难,因为你的断点在错误的位置。将它移到函数内部开始,这样您就不会越过它或进入它太远。
假设我想进入我的函数:
-> gene_signature = GeneSignature.from_geo(request.form)
(Pdb) s
接下来我总是得到的是:
--Call--
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(335)__getattr__()
-> def __getattr__(self, name):
(Pdb) n
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(336)__getattr__()
-> if name == '__members__':
(Pdb) n
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(338)__getattr__()
-> return getattr(self._get_current_object(), name)
(Pdb) n
--Return--
> ../venv/lib/python2.7/site-packages/werkzeug/local.py(338)__getattr__()->Immutabl...iDict([])
-> return getattr(self._get_current_object(), name)
(Pdb) n
仅在这些步骤之后我得到:
--Call--
> ../model/genesignature.py(72)from_geo()
-> @classmethod
发生什么事了?我可以避免单步执行这个中间代码吗?
两件事:
__getattr__
是内置的、可重写的方法,用于访问对象的属性。您可以避免在调试器中使用
n
而不是s
进入 "intermediate code" (您在第一次之后执行此操作但不是第一次,所以它 "steps" 进入这个调用。)
编辑添加:听起来你此时在 n
和 s
之间左右为难,因为你的断点在错误的位置。将它移到函数内部开始,这样您就不会越过它或进入它太远。