##// END OF EJS Templates
Be more explicit and don't use side effect of expression.
Be more explicit and don't use side effect of expression.

File last commit:

r25335:5a8935c7
r25486:1400f5e5
Show More
frame.py
94 lines | 3.0 KiB | text/x-python | PythonLexer
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 # encoding: utf-8
"""
Utilities for working with stack frames.
"""
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import sys
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
def extract_vars(*names,**kw):
"""Extract a set of variables by name from another frame.
Thomas Kluyver
Clean up numpydoc section headers
r13587 Parameters
----------
*names : str
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 One or more variable names which will be extracted from the caller's
Thomas Kluyver
Clean up numpydoc section headers
r13587 frame.
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
Thomas Kluyver
Clean up numpydoc section headers
r13587 depth : integer, optional
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 How many frames in the stack to walk when looking for your variables.
Thomas Kluyver
Clean up numpydoc section headers
r13587 The default is 0, which will use the frame where the call was made.
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
Thomas Kluyver
Clean up numpydoc section headers
r13587 Examples
--------
::
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
In [2]: def func(x):
...: y = 1
Thomas Kluyver
Fix tests in utils
r13373 ...: print(sorted(extract_vars('x','y').items()))
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 ...:
In [3]: func('hello')
Thomas Kluyver
Fix more cases relying on dict ordering in utils
r7014 [('x', 'hello'), ('y', 1)]
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 """
depth = kw.get('depth',0)
luz.paz
Whitespace fixes
r24494
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 callerNS = sys._getframe(depth+1).f_locals
return dict((k,callerNS[k]) for k in names)
def extract_vars_above(*names):
"""Extract a set of variables by name from another frame.
Similar to extractVars(), but with a specified depth of 1, so that names
luz.paz
Whitespace fixes
r24494 are extracted exactly from above the caller.
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
This is simply a convenience function so that the very common case (for us)
of skipping exactly 1 frame doesn't have to construct a special dict for
keyword passing."""
callerNS = sys._getframe(2).f_locals
return dict((k,callerNS[k]) for k in names)
def debugx(expr,pre_msg=''):
"""Print the value of an expression from the caller's frame.
Takes an expression, evaluates it in the caller's frame and prints both
the given expression and the resulting value (as well as a debug mark
indicating the name of the calling function. The input must be of a form
suitable for eval().
An optional message can be passed, which will be prepended to the printed
expr->value pair."""
cf = sys._getframe(1)
Thomas Kluyver
Convert print statements to print function calls...
r13348 print('[DBG:%s] %s%s -> %r' % (cf.f_code.co_name,pre_msg,expr,
eval(expr,cf.f_globals,cf.f_locals)))
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
# deactivate it by uncommenting the following line, which makes it a no-op
#def debugx(expr,pre_msg=''): pass
Scott Tsai
Refactor caller_module_locals() into extract_module_locals()
r6225 def extract_module_locals(depth=0):
Thomas Ballinger
fix docstring typo
r21856 """Returns (module, locals) of the function `depth` frames away from the caller"""
Scott Tsai
Refactor caller_module_locals() into extract_module_locals()
r6225 f = sys._getframe(depth + 1)
global_ns = f.f_globals
Scott Tsai
Move caller_module_and_locals() to IPython.util.frame
r6224 module = sys.modules[global_ns['__name__']]
Scott Tsai
Refactor caller_module_locals() into extract_module_locals()
r6225 return (module, f.f_locals)