【问题标题】:Python command line: ignore indentationPython 命令行:忽略缩进
【发布时间】:2013-07-11 01:30:32
【问题描述】:

我是 Python 新手。

简而言之:

在编写脚本期间,我不断地想通过将一些代码行从我的文本编辑器复制/粘贴到命令行 Python 解释器来测试我的程序的小片段。当这些行缩进时(例如因为它们是函数的一部分),我希望解释器忽略或不检查缩进,这样我就不必在复制/粘贴之前取消缩进。这可能吗?

更多详情:

这里是我的意思的简化示例:

假设我的文本编辑器包含以下正在开发的模块:

def MyFunc(arg):
    .../...
    if arg == 1:
        print "This is my function called with value 1."
        print "Done."
    else:
        print "This is my function called with value other than 1."
        print "Nothing else to say."
    .../...

假设我只是想立即测试前 2 行 print (上述代码的第 4 和 5 行),以便快速检查我的模块的至少该部分是否按预期运行。如果我同时选择两条线,我至少会沿着缩进选择第二条线(如果不是两条线)。在命令行粘贴时,我会收到该缩进的错误。

解释器的一个简单强制行为是它简单地忽略缩进。

更强大的行为是要求解释器不检查缩进。 IE。如果有缩进,那么解释器应该尝试使用它,以便我仍然可以复制/过去甚至是结构化的代码(例如上述代码的第 3 到 8 行)。但如果有缩进错误,它会忽略它们。

如果没有办法做我在这里要求的事情,那么有没有做类似事情的技巧:一种快速检查代码片段的简单方法,而无需在每次只想调整时运行整个程序这里和那里的一小部分。

注意 1:取消缩进 不是我正在寻找的解决方案。

注意 2:拥有解释器和复制/粘贴功能提供了一种非常强大的轻松测试代码的方法,但是如果周转无法解决,Python 的显式缩进机制对于使用此处描述的解释器是一个很大的缺点被发现。可惜了。

【问题讨论】:

  • 缩进对于解释 Python 至关重要 - 缩进的块指示代码的哪些行属于哪些条件结构、循环等。它不能被忽略。它不像 Java 或其他缩进仅用于样式和约定的语言。
  • 改用ipython
  • 如果您希望解释器忽略缩进,那么它应该如何处理您的代码而无法理解其结构?
  • @JoelDaroussin:不过,我们可以向您保证,拥有您在此处描述的能力是非常荒谬的。如果你不能(或不会)使用 IPython 或像样的程序员编辑器(允许矩形选择),你有 falsetru 添加初始块打开if 的小技巧。
  • 我相信你应该试试 IPython。请注意,它只是一种不同的交互式解释器,它不是一种新语言。它提供了更好的帮助机制、更好的格式化输出和错误,以及其他一些普通交互式解释器不做的有用的事情。它还附带一个 qtconsole,允许您进行真正的多行编辑(以及内联图形。)

标签: python testing text-editor indentation copy-paste


【解决方案1】:

在这种情况下,我使用以下技巧(前置if 1:):

>>> if 1:
...     print 1
...
1

【讨论】:

  • @Yve,在粘贴代码之前,输入if 1: + ,然后粘贴。
  • @Yve:在if 之后,您需要一个始终运行的缩进块,并且您粘贴了一个缩进块,所以...
  • 好招!迄今为止最好的建议。但是还是需要打字加一行。
  • 或者更好if True:
  • @PeterMortensen,如果是脚本,我会使用if True,但这是用于交互式shell;我更喜欢if 1:,因为它需要更少的击键。 ;)
【解决方案2】:

ipython %cpaste 函数将允许您粘贴缩进的代码并正常工作:

In [5]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:        print "This is my function called with value 1."
:        print "Done."
:^D<EOF>
This is my function called with value 1.
Done.

【讨论】:

  • 就像我展示的那样;在 ipython 中,输入 %cpaste 并粘贴。 (如果您粘贴通常会引发错误的缩进代码,ipython 甚至会告诉您这一点)
  • 如果只复制第二个缩进。即使用你的方法,还有IndentationError
  • 我只是将上面的两个打印行粘贴到 ipython qtconsole 中,没有做任何事情(即没有魔法),它就起作用了。
  • @zhangyangyu:如果复制第二层,不,不会报错。如果还复制了有凹痕的东西,你就无能为力了。
  • 谢谢!使用IPython 很诱人。但是,我将不得不推迟尝试,直到我有时间深入研究它。
【解决方案3】:

您可以创建虚拟代码块,以便在复制粘贴代码后以正确的方式缩进。 如果您要复制的代码如下所示:

...
    ...
        <python code to be copied>

然后在shell中,写:

>>> if True:
>>>     if True:
>>> <Paste your code here>

【讨论】:

  • 不错的建议,尽管@falsetru 已经提供了同样的东西。此外,假设您只是粘贴的代码不会比被复制的初始行向左“缩进”更远,那么您永远不需要超过一个虚拟块。
  • @JohnY 是的,我在发布答案后意识到已经告诉过同样的事情:-)
【解决方案4】:

你能避免复制标签吗?

Notepad++ 和 Visual Studio 允许在选择文本时按住 Shift + Alt 进行矩形选择。

您使用的任何编辑器都可能允许这样做。

是的,这并没有按照您的要求回答您的问题,但也许它会解决您的问题。

编辑:

gvim 允许包含所有行内容的矩形选择 Ctrl-l v Ctrl-q $ Shift-Down or Up arrow。 感谢 Joel 澄清这一点。

此链接解释并提供 vim 中的其他替代方案: http://vim.wikia.com/wiki/Add_trailing_blanks_to_lines_for_easy_visual_blocks

【讨论】:

  • 谢谢!如果我可以用gvim 来做这将是最好的答案。不幸的是gvim 将矩形选择限制为最短的线(请参阅上面的@Dennis Williamson 评论)。
  • 我不确定是否理解您的评论和问题。也许答案在我对原始帖子的最后评论中:“我在 Windows 上使用gVim 重新定义键。从Insert 模式那里正确的击键顺序是:Ctrl-l v Ctrl-q $ Shift-Down or Up arrow。这会进行块选择包括一直到结尾的行,无论它们的长度如何。这正是我需要的。所以它最终显示为 gVim 问题而不是 Python 问题。因为我彻底使用了这个,所以我用 autohotkey.com 编写了序列。我现在有一个完美的工具。”
  • @JoelDaroussin 我将您的详细信息编辑到此答案中。感谢您的澄清。我已经好几年没用过 vim 了,所以我没有一个简单的方法来尝试一下。
  • 谢谢。我编辑了您的编辑以指定此序列仅适用于 MS-Windows 下的 gVim。如果我从 Denis Williamsson 的评论中理解得很好,Linux 下 gVim 的顺序会略有不同。
猜你喜欢
  • 2023-03-13
  • 2018-07-11
  • 2018-06-20
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多