[英]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.