12

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

2 回答 2

29

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

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

In [2]: _
Out[2]: 4
于 2013-10-25T15:01:22.363 回答
3

您可以使用包含输入的命令/语句以及这些语句的相应输出(如果有)的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_valuelast 中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

于 2013-10-26T03:02:10.860 回答