iPython locals() 中的“_oh”是什么?以及如何在标准 python IDLE

如何解决iPython locals() 中的“_oh”是什么?以及如何在标准 python IDLE

我在 IPython (Spyder) 中使用命名空间,并试图看看如果我 dict.clear() locals() 会发生什么。 所以,事不宜迟:

Python 3.8.5 (default,Aug  5 2020,09:44:06) [MSC v.1916 64 bit (AMD64)]
Type "copyright","credits" or "license" for more information.

IPython 7.19.0 -- An enhanced Interactive Python.

In [1]: locals().clear()

In [2]: locals
Traceback (most recent call last):

  File "<ipython-input-2-f1c14746c80d>",line 1,in <module>
    locals

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py",line 263,in __call__
    self.update_user_ns(result)

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py",line 201,in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'


In [3]: dict
Traceback (most recent call last):

  File "<ipython-input-3-0d8c7dca5f1a>",in <module>
    dict

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py",in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'




In [4]: globals
Traceback (most recent call last):

  File "<ipython-input-6-0d1754e6861d>",in <module>
    globals

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py",in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'

由于内置函数具有单独的命名空间,因此尝试删除 local

In [5]: del locals
Traceback (most recent call last):

  File "<ipython-input-5-61828b7e8872>",in <module>
    del locals

NameError: name 'locals' is not defined

预期,因为命名空间本身已被删除

我尝试导入 builtins 并分配给 __builtins__

In [6]: import builtins
In [7]: __builtins__ = builtins
In [8]: __builtins__.dict
Traceback (most recent call last):

  File "<ipython-input-11-8211c7f1d719>",in <module>
    __builtins__.dict

  File "C:\Users\sayan\Anaconda3\envs\tfgpu_py38\lib\site-packages\IPython\core\displayhook.py",in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'

此时我注意到所有错误都归因于 _oh。所以我重新启动内核,并检查本地:

locals()
Out[1]: 
{'__name__': '__main__','__doc__': 'Automatically created module for IPython interactive environment','__package__': None,'__loader__': None,'__spec__': None,'__builtin__': <module 'builtins' (built-in)>,'__builtins__': <module 'builtins' (built-in)>,'_ih': ['','locals()'],'_oh': {},'_dh': ['D:\\Programs\\Python\\StackOv'],'In': ['','Out': {},'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x000002C2953F37F0>>,'exit': <IPython.core.autocall.ZMQExitAutocall at 0x2c295420af0>,'quit': <IPython.core.autocall.ZMQExitAutocall at 0x2c295420af0>,'_': '','__': '','___': '','_i': '','_ii': '','_iii': '','_i1': 'locals()'}

所以 _oh 似乎是一个空字典。现在:

In [2]: locals().clear()

In [3]: dict
Traceback (most recent call last):

  File "<ipython-input-3-0d8c7dca5f1a>",in update_user_ns
    if self.cache_size and result is not self.shell.user_ns['_oh']:

KeyError: '_oh'


In [4]: locals()['_oh'] = {}

In [5]: dict
Out[5]: dict

所以我找到了如何取回 locals,但不明白为什么将空 dict 分配为 _oh 会带回 locals

但同样的事情在 python IDLE 中不起作用:

Python 3.7.7 (default,May  7 2020,21:25:33)
[GCC 7.3.0] :: Anaconda,Inc. on linux
Type "help","copyright","credits" or "license" for more information.
>>> locals()
{'__name__': '__main__','__doc__': None,'__loader__': <class '_frozen_importlib.Builtinimporter'>,'__annotations__': {},'__builtins__': <module 'builtins' (built-in)>}
>>> locals().clear()
>>> locals()
Traceback (most recent call last):
  File "<stdin>",in <module>
NameError: name 'locals' is not defined
>>> dict
Traceback (most recent call last):
  File "<stdin>",in <module>
NameError: name 'dict' is not defined
>>> import builtins
Traceback (most recent call last):
  File "<stdin>",in <module>
ImportError: __import__ not found
>>> __builtin__
Traceback (most recent call last):
  File "<stdin>",in <module>
NameError: name '__builtin__' is not defined
>>>

没有 _oh,甚至 __import__ 也不起作用。

  • 问题 1:如果赋值 (__builtins__ = builtins) 有效,为什么我无法访问内置函数
  • 问题 2:_oh 中的 iPython 是什么以及它如何帮助当地人回归,因为它本身就是一个空的 dict
  • 问题 3: 如何让 locals()locals().clear() 后在 python IDLE 中工作(无需重新启动 IDLE)

如果问题 3 在本答案的范围内过于宽泛,我可以提出一个单独的问题。谢谢。

注意:我在 Windows 10 上尝试了 IPython,在 linux (Ubuntu) 上尝试了标准的 python 提示符。不要认为这有什么不同,为了完整起见添加了它。

解决方法

在正在运行的 ipython 会话中:

In [109]: id(Out)
Out[109]: 139634741914432
In [110]: id(_oh)
Out[110]: 139634741914432

_ohOut 字典的另一个名称,我们可以将其用作:

In [112]: Out[109]
Out[112]: 139634741914432
In [113]: _oh[109]
Out[113]: 139634741914432
In [114]: _109
Out[114]: 139634741914432

我不知道为什么他们使用另一个名字。在任何情况下,通过 locals().clear(),您都清除了在 Out[1] 中看到的整个变量字典,并有效地禁用了 ipython 交互式会话。

我不知道使用 locals.clear() 有什么价值。它可能在函数内部“更安全”。

Magic %who 显示交互式变量,即您自己的代码创建的变量。可能有一种方法可以选择性地删除它们,但我不需要它。如果我需要一个干净的 ipython 会话,我只需在新的 shell 选项卡或窗口中启动一个。

我很长时间没有使用 IDLE(甚至没有安装它),所以对它的 locals() 无能为力。它有一个更简单的历史机制。

看看魔术,有一个 %reset 可用于删除用户定义的变量,甚至清除 In/Out 历史记录。阅读其文档。

另见%who_ls%reset_selective

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?