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

3

入力されたコマンド/ステートメントと、それらのステートメントの対応する出力 (存在する場合) を含むIPythonInと変数を使用できます。Out

したがって、素朴なアプローチは、これらの変数を%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の値nameではなくを返します。

その制限を考慮して、モジュールを使用して、次のような式を試して評価できます (最後のparserに追加できます)。last_assignment_valueif 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 に答える