【问题标题】:IPython magic print variables on assignment赋值时的 IPython 魔术打印变量
【发布时间】:2018-05-20 17:52:53
【问题描述】:

IPython 中是否有一个参数可以在我每次分配变量时打印它们?

目前:

In [1]: a = 5

In [2]: a
Out[2]: 5

In [3]: b = a + 1

In [4]: b
Out[4]: 6

在 matlab 中,除非最后写一个 ;,否则会打印该变量,在 ipython 中我想用这样的魔术函数来激活它:

In [1]: %printassignment

In [2]: a = 5
a = 5

In [3]: b = a + 1
b = 6

我可以编写自己的魔法,但我很确定这是标准的东西,人们会制作一个超级调谐、标准的函数。该功能对初学者特别有用。

【问题讨论】:

  • 使用ipython 一段时间后,我发现MATLAB/Octave 自动打印很痛苦。我一直忘记;。如果我想在 Ipython 中查看计算,我只是省略了赋值。如果我想保存显示的值,我可以随时使用x=_
  • 我完全同意,这就是为什么我不说它应该是默认的,或者更糟糕的是,我完全不推荐在脚本中使用它。但是,我想在我的小学生课堂上使用它,我真的想强调“python 计算器”与“普通计算器”一样简单直观。关于 x = _ 我完全同意!但是在历史上,当我写“x =” 重新计算时,我没有得到表达式,我得到_,这是没有用的。此外,在学生面前现场使用时,如果他们想写下中间值,更容易跟上。

标签: python ipython


【解决方案1】:

从 IPython 6.2 开始,this exists,但是打开它的命令真的很长:

%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'

你可以在你的ipython_config.py中设置它,如果你希望它默认开启:

c = get_config()
c.InteractiveShell.ast_node_interactivity = 'last_expr_or_assign'

仅在赋值目标为简单名称时触发; arr[i] = valobj.attr = 3 之类的作业不会自动打印。

【讨论】:

  • +0 ...这不是一回事。不像 MATLAB 那样工作。真的一点用都没有,真的(尝试设置属性)。
  • @wim:有什么不同?我还不能测试它。
  • 我以前用过,IIRC 它只是打印一个普通的旧赋值语句的 RHS 值。 edit: 显然有一个open issue 可以让这个功能更好地工作,但没人关心。
  • @wim:检查code,看起来它的设计目的是仅在分配目标是简单名称时触发,可能是因为其他分配类型可能会对分配的任何内容执行更复杂的操作. (比如float_arr[i] = some_int之后,你是显示some_int还是float_arr[i]?)我不知道MATLAB的表现如何,但我会在答案中做说明。
  • 它实际上实现了我的其他变体,写结果而不打印名称:) 即。在 a = 1 之后,一个有“_ == 1”,而在编写 1+1 之后的建议版本中,a = 1 一个看到“a = 1”(带有变量名)但“_”仍然是 2 它可能是可调:D
【解决方案2】:

为旧版本的 IPython 尝试以下操作……

from IPython.core.inputtransformer import InputTransformer
import re

class PrintAssignment(InputTransformer):
    def __init__(self):
        self.assignment = re.compile('^([a-z]+) =')
        self.most_recent_line = None
    def push(self, line):
        self.most_recent_line = line
        return line
    def reset(self):
        if not self.most_recent_line: return
        match = self.assignment.match(self.most_recent_line)
        self.most_recent_line = None
        if match: return match.group(1)

然后用

注册这个输入处理程序
ip = get_ipython()
ip.physical_line_transforms.append(PrintAssignment())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2013-04-23
    • 2013-01-02
    相关资源
    最近更新 更多