【问题标题】:Block Element Characters in Python 3 Module DocstringPython 3 模块文档字符串中的块元素字符
【发布时间】:2021-11-06 07:54:52
【问题描述】:

我正在为 Python 3 的模块编写描述文档字符串,并尝试包含以下字符“█╗ ╔═║╝╚–”。在 Linux 上,这工作得很好,但是 Windows 上的相同代码会打印它们的 Unicode 引用,例如"\u2588" 等。如何纠正 Windows 上的行为?

例子:

#!/usr/bin/env python3
"""
I want to use these characters █╗ ╔═║╝╚–
"""

# foo module
pass

期望的行为:

>>> import fooModule
>>> help(fooModule)
Help on module fooModule:

NAME
    fooModule

DESCRIPTION
    I want to use these characters █╗ ╔═║╝╚–

[etc]

非常感谢您提供的任何帮助!

【问题讨论】:

    标签: python-3.x unicode


    【解决方案1】:

    好的——所以我找到了一种解决方法。我已经在使用platform.system() 来读取用户的操作系统。因此,现在如果程序检测到它在 Windows 上运行,它会替换问题字符:

    from platform import system
    
    if system() == 'Windows':
        # Windows doesn't let us have nice things in our docstrings
        __doc__ = __doc__.replace('█', '#')
        __doc__ = __doc__.replace('–', '--')
        for r in '╗╔═║╝╚':
            __doc__ = __doc__.replace(r, ' ')
    

    这意味着任何在文本编辑器中查看代码的人仍将看到预期的文档字符串,任何在 Linux 或 MacOS 上使用 help() 的人也将如此。 Windows 用户将获得较差的体验,但文档字符串至少对他们来说是易读的。

    【讨论】:

    • 请注意,使用错误的字符是 Windows cmd.exe 的help() 问题。使用支持 UTF-8 的 IDE 将正确显示,因此此解决方案可能在 cmd.exe 中有效,但会破坏其他 Python 环境。最好在 Windows 上坚持使用 ASCII,或者在 cmd.exe 中检测具体运行。
    • 我看看能不能测试一下shell类型;看起来psutil 可能对此有用。在 Windows 上,顺便说一下,我使用的是 PowerShell。稍后我会再次更新,因为这里已经很晚了。顺便说一句,是否有任何非 Windows 案例可能会出现此问题?
    • 我测试了 powershell,它和 cmd.exe 有同样的问题(它仍然使用文本控制台),但是对于 IDE(我用 pywin32 模块中的 PythonWin 测试)它工作正常。我想如果 Linux 的终端没有配置为 UTF-8,它可能会出现问题。坚持使用 ASCII 的另一个原因。
    • >>> 我想如果 Linux 的终端没有配置为 UTF-8 可能会有问题 --- 有没有一种简单的方法可以从 Python 中测试终端的配置?到目前为止我还没有发现任何东西。 (你好,我假期回来了)
    【解决方案2】:

    这似乎是一个错误,help() 使用 ANSI 代码页来确定可打印字符,但 Windows 控制台使用的是 OEM 代码页。如果您在源代码中对 Windows 控制台的 OEM 编码 cp437 使用 Windows-1252 等效字符,则 Windows 控制台会正确显示它们(Python 3.8):

    def f():
        """
        I want to use these characters Û» Éͺ¼È
        """
        pass
    
    help(f)
    print('Û» Éͺ¼È█╗ ╔═║╝╚')
    

    输出(Windows 控制台):

    Help on function f in module __main__:
    
    f()
        I want to use these characters █╗ ╔═║╝╚
    
    Û» Éͺ¼È█╗ ╔═║╝╚
    

    请注意,支持 UTF-8 的 IDE 会按指定显示字符。即使通过 chcp 1252 更改 Windows 控制台代码页,它们仍然无法正确显示。在帮助渲染过程中的某个地方,编码/解码执行不正确。

    【讨论】:

    • 感谢您的帮助!我有点不确定如何实施您的解决方案。你是说我可以用另一个可以代替的字符替换字符(我尝试复制你上面所做的,但它产生的结果与我之前的努力相同),或者我需要更改字符串的字符编码?如果我必须更改终端设置才能正确查看文档字符串,那将无法作为解决方案,因为我不能指望最终用户仅为我的程序更改他们的设置。
    • @Mark 它更多的是解释而不是解决方案。如果您希望在 Windows 控制台上正确读取它们,我不建议在 doc 字符串中使用非 ASCII 字符
    • 啊,无论如何谢谢你。似乎无论我是否必须在 Python 中做任何涉及特殊字符的事情,都是 Windows 让我的生活变得困难。我将不得不做一些与我计划不同的事情。如果我以后遇到解决方案,我会相应地更新线程。
    • 更新:我想出了一个变通方法,我已将其添加为答案。
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2023-02-24
    • 2021-05-03
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2022-12-06
    • 2017-09-25
    相关资源
    最近更新 更多