<p>已经有一个<a href="http://docs.python.org/2/library/pdb.html" rel="nofollow">python debugger</a>可以让您检查局部变量,因此没有必要用随机实例属性污染对象。在</p>
<p>另外,如果多个方法使用相同的局部变量名,则该方法不起作用,因为方法可能会覆盖某些实例属性,从而使对象的状态处于不明确的状态。在</p>
<p>另外,您的解决方案与<a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="nofollow">DRY principle</a>背道而驰,因为您必须在每个<code>return</code>之前添加代码。在</p>
<p>另一个缺点是,在方法执行过程中,您经常想知道多个地方局部变量的状态,而这对于您的答案是不可能的。在</p>
<p>如果您真的想手动保存局部变量,那么类似这样的方法可能比您的解决方案要好得多:</p>
<pre><code>import inspect
from collections import defaultdict
class LogLocals(object):
NO_BREAK_POINT = object()
def __init__(self):
self.__locals = defaultdict(defaultdict(list))
def register_locals(self, local_vars, method_name=None,
break_point=NO_BREAK_POINT):
if method_name is None:
method_name = inspect.currentframe(1).f_code.co_name
self.__locals[method_name][break_point].append(local_vars)
def reset_locals(self, method_name=None, break_point=NO_BREAK_POINT,
all_=False):
if method_name is None:
method_name = inspect.currentframe(1).f_code.co_name
if all_:
del self.__locals[method_name]
else:
del self.__locals[method_name][point]
def get_locals(self, method_name, break_point=NO_BREAK_POINT):
return self.__locals[method_name][break_point]
</code></pre>
<p>您只需从它继承,并在需要保存状态时调用<code>register_locals(locals())</code>。它还允许区分“断点”,最重要的是它不会污染实例。
此外,它还区分了返回状态的<code>list</code>而不是最后一个状态的不同调用。在</p>
<p>如果要通过属性访问某些调用的局部变量,只需执行以下操作:</p>
^{pr2}$
<p>不管怎样,我相信这没什么用。你应该使用python调试器。在</p>