如何获取iPython中最后一个赋值变量的值?

时间:2013-10-25 14:51:55

标签: python ipython

我是一个完整的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

2 个答案:

答案 0 :(得分:23)

最后一个返回的对象_有一个快捷方式。

In [1]: 1 + 3
Out[1]: 4

In [2]: _
Out[2]: 4

答案 1 :(得分:2)

您可以使用IPython的InOut变量,其中包含输入的命令/语句以及这些语句的相应输出(如果有)。

因此,一种天真的方法是使用这些变量作为定义%last魔法的基础。

但是,由于并非所有语句都必须生成输出,因此InOut不同步。

因此,我提出的方法是解析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

这将输出分配为字符串的字词可能不是您想要的)。

然而,有一点需要注意:如果您输入了涉及分配的错误输入;例如:(a = 2),这种方法会捡起来。并且,如果您的作业涉及变量:例如a = name,此方法将返回name而不是的名称。

鉴于此限制,您可以使用parser模块尝试评估表达式(可以在最后last_assignment_value中附加到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可能存在的弊端,我已经将这种情况留给了你。

但是,说实话,一个真正有益健康的方法将涉及解析语句以验证找到的输入的有效性,以及之前的输入等等。

参考文献: https://gist.github.com/fperez/2396341