【问题标题】:How to fix redefinition of str? [duplicate]如何修复str的重新定义? [复制]
【发布时间】:2015-06-02 08:38:18
【问题描述】:

在使用 Python 解释器进行实验时,我无意中将一个字符串分配给了str,如下所示:

str = 'whatever'

后来在同一个会话中,我输入了另一个语句,调用了str(),比如说...

double_whatever = str(2) + ' * whatever'

...,并得到错误 TypeError: 'str' object is not callable(而不是预期的输出 '2 * whatever')。 related SO answer 帮助我快速发现自己犯的错误。

但是,我仍然不清楚如何在受影响的会话中修复对 str() 的调用。当然我可以退出 Python 解释器并开始另一个会话,但我很好奇如何避免这种情况。

到目前为止,我已经确认...

double_whatever = __builtins__.str(2) + ' * whatever'  # => '2 * whatever'

...仍然像我想要的那样工作;但我不清楚如何恢复不需要__builtins__. 资格。

如何解决我无意中重新定义 str 以便我在 Python 解释器会话中对 str() 的调用再次起作用?

【问题讨论】:

  • 这个最近的 SO 答案会有所帮助:stackoverflow.com/a/30563742/3923281
  • 谢谢。这看起来很准确,str 并不是唯一可能犯这个错误的人。我实际上正在学习一个 ORA 在线课程,该课程让我分配给str...并且必须为每堂课假设一个新课程。 :P
  • 不是最好的,但很简单:str = __builtins__.str
  • @KarolyHorvath:是的,确实如此。我修补了一些接近的东西......现在看看它为什么失败了。我试过str = __builtins__.str(),当然不一样;但你的建议是我的意图。谢谢!

标签: python string


【解决方案1】:

只需删除您的覆盖str

del str

阅读http://www.diveintopython.net/html_processing/locals_and_globals.html,了解 Python 如何为您找到变量。

基本思想是首先搜索定义变量的命名空间,因此如果定义名称为str 的变量,built-in 将被覆盖。

【讨论】:

  • 你打败了我,轻松获得了一些积分。 :)
  • @Pynchia 让我与您分享一个赞成票;)
  • 我很高兴我对 Python 的相对缺乏经验可以促成这样的运动。 :) 我从来没有遇到过del 关键字,而it is a little odd 对我来说是基于对其他语言的更多经验(但我想这并不比在 JS 中重新定义内置函数的能力更奇怪):这非常适合我相信你很自信地期待。谢谢!
  • @satoru:谢谢,但没关系。你应得的。我敢肯定,我不是唯一一个要点击并笑的人。我喜欢这些东西。 :)
  • @J0e3gan 我已经更新了答案并添加了一个链接到 Dive into Python 的相关章节。
猜你喜欢
  • 2019-10-14
  • 1970-01-01
  • 2014-10-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多