2013-07-12 99 views
27

我是Python新手。Python命令行:忽略縮進

簡而言之:

在腳本我一直想通過複製測試小位,我的節目片/從我的文字編輯器,命令行Python解釋器粘貼一些代碼行(S)。當這些行縮進(例如因爲它們是函數的一部分)時,我希望解釋器忽略或不檢查縮進,以便在複製/粘貼之前不必取消縮進。那可能嗎?

在更多的細節:

這裏我的意思一個簡單的例子:

比方說我的文字編輯器包含目前正在開發以下模塊:

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." 
    .../... 

而且我們說我只是想直接測試第一個print行(上面代碼的第4行和第5行),以便快速檢查我的模塊是否至少有部分行爲與預期一致。如果我同時選擇兩條線,我將至少選擇沿着第二條線的縮進(如果不是兩個)。當在命令行上粘貼時,我會得到該縮進的錯誤。

解釋器的一個簡單的強制行爲是它只是忽略縮進。

更強大的行爲是要求解釋器不檢查縮進。即如果有縮進,那麼解釋器應該嘗試使用它,這樣我仍然可以複製/過去甚至是結構化的一段代碼(例如上面代碼的第3到第8行)。但是如果有縮進錯誤,它會忽略它們。

如果沒有辦法做我在這裏要求的東西,那麼有什麼技巧可以做類似的事情:一種簡單的方法來快速檢查代碼段,而無需每次只想運行整個程序時調整它的一小部分。

注意1:無縮進是不是解決方案,我正在尋找。

注意事項2:將解釋器與複製/粘貼功能一起提供了一種非常強大的輕鬆測試代碼的方式,但Python的顯式縮進機制對於此處所述的解釋器的使用是一個很大的缺點,如果轉換無法找到。會很遺憾。

+2

縮進到Python解釋至關重要 - 縮進塊指示你的代碼秋天在條件結構,循環等,不能哪行被忽略。它不像Java或其他語言,縮進僅適用於樣式和慣例。 – user2048643

+0

正如用戶上面所說,縮進是python的一個重要組成部分,它是無法繞過它的。相反,複製代碼時不需要縮進:通常可以使用Alt + Select選擇一個矩形塊。 – RoadieRich

+9

用ipython代替 – wim

回答

45

在這種情況下,我使用下面的技巧(前置if 1:):

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

@yve,在粘貼您的代碼之前,輸入'if 1:'+ ,然後粘貼。 – falsetru

+0

@yve:在'if'之後,你需要一個總是可以運行的縮進塊,並且你粘貼了一個縮進塊,所以... – geoffspear

+0

好戲!最好的建議到現在爲止。但仍然需要輸入添加行。 –

34

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. 
+0

正如我所示;在ipython中,輸入'%cpaste'並粘貼。 (如果你粘貼縮進的代碼,通常會引發錯誤,ipython甚至會告訴你這個) – geoffspear

+0

如果只複製第二個縮進。即使使用你的方法,仍然存在'IndentationError'。 – zhangyangyu

+0

我只是將上面的兩行打印行粘貼到ipython qtconsole中,而沒有做任何事情(即沒有任何魔法),它只是工作。 – Christoph

2

那麼你可以創建虛擬代碼塊,以便在複製粘貼代碼後縮進正確的方式。 如果從正在複製看起來像這樣的代碼:

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

然後在外殼,寫:

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

不錯的建議,儘管@falsetru已經提供了同樣的事情。另外,假設你只是粘貼代碼,而不是「縮進」到比被複制的起始行更靠左側的代碼,那麼你永遠不需要多於一個的虛擬塊。 –

+0

@JohnY是的,我發佈了我的答案後已經意識到,同樣的事情已經被告知:-) – Sudipta

6

你能只是避免複製的標籤?

Notepad ++和Visual Studio允許在選擇文本時按住Shift + Alt進行矩形選擇。

不管你用什麼編輯器都可以。

是的,這並不回答你的問題,但也許它會解決你的問題。

編輯:

GVIM允許矩形的選擇包括由Ctrl-l vCtrl-q$Shift-Down or Up arrow所有行內容。 感謝Joel澄清這一點。

此鏈接解釋,並提供VIM內的其他替代方案: http://vim.wikia.com/wiki/Add_trailing_blanks_to_lines_for_easy_visual_blocks

+0

謝謝!如果我可以用'gvim'完成這將是最好的答案。不幸的是'gvim'限制了一個矩形選擇,它是最短的行(見我的評論@Dennis Williamson上面)。 –

+0

@JoelDaroussin回顧我的編輯 - gvim是否支持'set ve'? – dss539

+0

我不確定要了解您的評論和問題。也許這個答案是在我最後發表的評論中提到的:「我正在使用'gVim'在Windows上重新定義鍵。'Insert'模式下正確的按鍵順序是:'Ctrl-l v Ctrl-q $ Shift-Down或Up arrow',這使得一個塊的選擇包括了直到它們結束的行,不管它們的長度如何,這正是我需要的,所以它最終成爲gVim問題而不是Python問題,因爲我徹底地使用了它我用[autohotkey.com](http://autohotkey.com)編寫了這個序列,現在我有了一個完美的工具。「 –