我是一个完全的 iPython 新手,但我想知道是否有办法获取最后分配的变量的值:
In [1]: long_variable_name = 333
In [2]: <some command/shortcut that returns 333>
在 R 中,我们有.Last.value
:
> long_variable_name = 333
> .Last.value
[1] 333
最后返回的对象有一个快捷方式,_
.
In [1]: 1 + 3
Out[1]: 4
In [2]: _
Out[2]: 4
您可以使用包含输入的命令/语句以及这些语句的相应输出(如果有)的IPythonIn
和变量。Out
因此,一种天真的方法是使用这些变量作为定义%last
魔术方法的基础。
但是,由于并非所有语句都必须生成输出,In
并且Out
不是同步的。
因此,我想出的方法是 parse In
,并查找出现=
并解析这些行以获取输出:
def last_assignment_value(self, parameter_s=''):
ops = set('()')
has_assign = [i for i,inpt in enumerate(In) if '=' in inpt] #find all line indices that have `=`
has_assign.sort(reverse=True) #reverse sort, because the most recent assign will be at the end
for idx in has_assign:
inpt_line_tokens = [token for token in In[idx].split(' ') if token.strip() != ''] #
indices = [inpt_line_tokens.index(token) for token in inpt_line_tokens if '=' in token and not any((c in ops) for c in token)]
#Since assignment is an operator that occurs in the middle of two terms
#a valid assignment occurs at index 1 (the 2nd term)
if 1 in indices:
return ' '.join(inpt_line_tokens[2:]) #this simply returns on the first match with the above criteria
最后,在 IPython 中创建您自己的自定义命令:
get_ipython().define_magic('last', last_assignment_value)
而且,现在您可以致电:
%last
这会将分配的术语输出为字符串(这可能不是您想要的)。
但是,对此有一个警告:如果您输入了涉及分配的错误输入;eg: (a = 2)
,这个方法会捡起来的。而且,如果您的分配涉及变量:例如a = name
,此方法将返回name
而不是name 的值。
鉴于该限制,您可以使用该parser
模块尝试和评估这样的表达式(可以附加到last_assignment_value
last 中if statement
):
import parser
def eval_expression(src):
try:
st = parser.expr(src)
code = st.compile('obj.py')
return eval(code)
except SyntaxError:
print 'Warning: there is a Syntax Error with the RHS of the last assignment! "%s"' % src
return None
但是,考虑到 可能存在的弊端eval
,我已将包含内容留给您。
但是,老实说,一个真正有益的方法将涉及解析语句以验证找到的输入的有效性,以及它之前的输入等等。