=='

我在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都是打印语句的输出; python缓冲区总是显示>>>并立即打印,我意识到这一点,这不是问题。)

按照预期,从命令行, pythonpython -i显示“确实”。

Emacs如何能够将__name__=='__main__'评估为True ,而不执行里面的内容, if __name__ == '__main__': __name__=='__main__' if __name__ == '__main__': 那么如何重新配置​​它,使其不再这样做?


正如评论中提到的@Wooble,它可能是python.el问题: Cc Cc运行
python-shell-send-buffer函数:

python-shell-send-buffer是`python.el'中交互式编译的Lisp函数。

(python-shell-send-buffer和可选的ARG)

将整个缓冲区发送给低级Python进程。 使用前缀ARG允许执行由"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调用中运行。

链接地址: http://www.djcxy.com/p/79137.html

上一篇: == '

下一篇: Merge two arraylists in a simple form of Polish Notation