为啥 str(KeyError) 添加额外的引号?

Posted

技术标签:

【中文标题】为啥 str(KeyError) 添加额外的引号?【英文标题】:Why does str(KeyError) add extra quotes?为什么 str(KeyError) 添加额外的引号? 【发布时间】:2014-09-19 20:39:05 【问题描述】:

为什么KeyError 的字符串表示会在错误消息中添加额外的引号?所有其他内置异常只是直接返回错误消息字符串。

例如下面的代码:

print str(LookupError("foo"))
print str(KeyError("foo"))

产生以下输出:

foo
'foo'

我已经尝试过使用其他内置异常(IndexErrorRuntimeErrorException 等)的样本,它们都返回不带引号的异常消息。

help(KeyError) 表示__str__(...) 是在KeyError 中定义的,而LookupError 则使用BaseException 基类中定义的LookupError。这解释了行为有何不同,但没有解释为什么 __str__(...)KeyError 中被覆盖。 built-in exceptions 上的 Python 文档没有说明这种差异。

针对 Python 2.6.6 测试

【问题讨论】:

【参考方案1】:

这样做是为了让您可以正确检测到KeyError('')。来自KeyError_str function source:

/* If args is a tuple of exactly one item, apply repr to args[0].
   This is done so that e.g. the exception raised by [''] prints
     KeyError: ''
   rather than the confusing
     KeyError
   alone.  The downside is that if KeyError is raised with an explanatory
   string, that string will be displayed in quotes.  Too bad.
   If args is anything else, use the default BaseException__str__().
*/

确实,如果str(value) 是空字符串,traceback printing code 将不会打印异常值。

【讨论】:

以上是关于为啥 str(KeyError) 添加额外的引号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到此错误? KeyError:“没有”

转储到 JSON 添加额外的双引号和引号转义

Laravel Blade 指令添加额外的引号

python csv writer添加了额外的引号

Pyspark 在数组中添加额外的双引号以节省时间

为啥我有 KeyError:'val_acc'?