代码之家  ›  专栏  ›  技术社区  ›  Diego F Medina

KeyError-Python 3.3中错误消息的新行

  •  8
  • Diego F Medina  · 技术社区  · 7 年前

    我在空闲时使用Python 3.3。在运行类似以下内容的代码时:

    raise KeyError('This is a \n Line break')
    

    它输出:

    Traceback (most recent call last):
      File "test.py", line 4, in <module>
        raise KeyError('This is a \n Line break')
    KeyError: 'This is a \n Line break'
    

    我希望它输出带有换行符的消息,如下所示:

    This is a
     Line Break
    

    我曾尝试在使用os之前或使用os将其转换为字符串。但是似乎什么都不起作用。有什么方法可以强制消息在空闲屏幕上正确显示吗?


    如果我提出 Exception (而不是 KeyError )那么输出就是我想要的,但我仍然想提出一个 键错误 如果可能的话。

    2 回复  |  直到 7 年前
        1
  •  10
  •   mgilbert    6 年前

    你的问题与空闲无关。您看到的行为都来自Python。从命令行以交互方式运行当前存储库CPython,我们可以看到您报告的行为。

    Python 3.7.0a2+ (heads/pr_3947:01eae2f721, Oct 22 2017, 14:06:43)
    [MSC v.1900 32 bit (Intel)] on win32
    
    >>> raise KeyError('This is a \n Line break')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'This is a \n Line break'
    >>> s = 'This is a \n Line break'
    
    >>> s
    'This is a \n Line break'
    >>> print(s)
    This is a
     Line break
    >>> raise Exception('This is a \n Line break')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    Exception: This is a
     Line break
    >>> raise IndexError(s)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: This is a
     Line break
    >>> try:
    ...   raise  KeyError('This is a \n Line break')
    ... except KeyError as e:
    ...   print(e)
    
    'This is a \n Line break'
    >>> try:
    ...   raise  KeyError('This is a \n Line break')
    ... except KeyError as e:
    ...   print(e.args[0])
    
    This is a
     Line break
    

    我不知道为什么KeyError的行为与索引器不同,但打印e.args[0]应该适用于所有异常。

    编辑

    this old tracker issue ,其中引用了 KeyError 源代码:

    /* 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__().
        */
    

    此部分出现在 KeyError_str 中的对象定义 Objects/exceptions.c 的Python源代码。

    我将提到你的问题,作为这种差异的另一种表现。

        2
  •  3
  •   NameVergessen    2 年前

    那里 获得所需行为的一种方法:只需子类 str 和覆盖 __repr__

        class KeyErrorMessage(str):
            def __repr__(self): return str(self)
        msg = KeyErrorMessage('Newline\nin\nkey\nerror')
        raise KeyError(msg)
    

    打印:

    回溯(最近一次呼叫最后一次):
    ...
    文件“”,第5行,in
    raise KeyError(消息)
    关键错误:换行
    在里面

    错误