[英]Python in emacs: __name__ == '__main__', but somehow not
我在 emacs 中編碼 python。 然而,不知何故,在 emacs 中運行的 python 解釋器讓我感到驚訝。
如果我寫
print()
print(__name__)
print(__name__=='__main__')
if __name__ == '__main__':
print("indeed")
在 emacs 緩沖區中,並告訴 emacs 啟動解釋器並運行該緩沖區的內容,我得到一個包含
Python 3.3.5 (default, Mar 18 2014, 02:00:02)
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
>>>
__main__
True
>>>
( __main__
和True
都是 print 語句的輸出;python 緩沖區總是顯示>>>
並在它之后立即打印。我知道這一點,這不是問題。)
從命令行, python
和python -i
都顯示“確實”,正如預期的那樣。
Emacs 如何能夠評估__name__=='__main__'
到True
的不一致,而不執行內部的事情if __name__ == '__main__':
? 以及如何重新配置它使其不再這樣做?
正如評論中提到的@Wooble ,它可能是python.el
問題: Cc Cc
運行
python-shell-send-buffer
函數:
python-shell-send-buffer是`python.el'中的交互式編譯Lisp函數。
(python-shell-send-buffer&optional ARG)
將整個緩沖區發送到劣質Python進程。 使用前綴ARG允許執行由
"if __name__=='__main__':"
分隔的塊內的代碼"if __name__=='__main__':"
即,要打印“確實”,添加前綴Cu Cc Cc
。
問:我試圖通過python.el挖掘,我仍然不確定它是如何做到這一點的。 你能解釋一下,所以我可以修改默認行為嗎?
要找出Cc Cc
在您的情況下執行的操作,請打開python文件並鍵入Mx describe-key RET
然后鍵入Cc Cc
(實際按鍵)。 默認情況下,它在python.el
運行python-shell-send-buffer
函數。 您可以重新定義鍵以使用參數調用函數,以便Cc Cc
行為類似於Cu Cc Cc
,它可以運行"if __name__=='__main__':"
part:
;; Make C-c C-c behave like C-u C-c C-c in Python mode
(require 'python)
(define-key python-mode-map (kbd "C-c C-c")
(lambda () (interactive) (python-shell-send-buffer t)))
一旦啟動了python shell,就可以簡單地覆蓋變量:
__name__ = 'repl'
這可以防止任何if __name__=='__main__':
塊在任何后續的Cc Cc
調用上運行。
這個“功能”永遠不會過時。 嘗試使用
__name__=='__main__':
運算符之間沒有空格。
那么 python.el 將不會繞過它。 所以看看你的代碼格式化程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.