【问题标题】:Why can't byte strings be used as Docstrings?为什么字节字符串不能用作 Docstrings?
【发布时间】:2016-11-20 14:55:05
【问题描述】:

为什么字节字符串b'string' 不能用作类或函数的文档字符串(而且我猜测是模块)?

例子:

>>> class Foo:
...     b"""My Foo class for Fooing"""
>>> Foo.__doc__ is None
True

与函数类似。

对于r''、u''(预期的)字符串,它可以正常工作。我在文档中也找不到任何东西。知道这是为什么吗?

【问题讨论】:

  • 可能是因为它们实际上不是文本。

标签: python string python-3.x byte


【解决方案1】:

正如 @IgnacioVazquez-Abrams 所指出的,b'string' 不是文本,或者更具体地说,它不是字符串,而是 bytes object,我认为你不会在 Python 文档中的任何地方都可以看到这些被称为“字节字符串”的东西(尽管我可能是错的);事实上,这对我个人来说听起来很矛盾。

另一方面,r'' 和 u'' 和 '' 是字符串(分别为原始字符串文字、Unicode 字符串文字和字符串文字)。 the spec for docstrings 的第一句话说:

文档字符串是作为模块、函数、类或方法定义中的第一条语句出现的字符串文字。这样的文档字符串成为该对象的__doc__ 特殊属性。

它还指定:

如果您在文档字符串中使用任何反斜杠,请使用 r"""raw triple double quotes"""。对于 Unicode 文档字符串,请使用 u"""Unicode triple-quoted strings"""。

这可能不是一个令人满意的答案,因为它没有解释为什么__doc__ 在一种情况下会返回一个字符串,而在另一种情况下会返回一个字符串None,或者文档字符串是如何形成/解析的。但是,我认为正在发生的事情是你得到了None,因为你还没有定义一个文档字符串,而只是一个你没有分配给你的类中任何变量的字节对象。如果你这样做,同样的事情会发生:

class Foo:
    1

1 没有被解析为类的文档字符串(或 __doc__ 属性),因为它不是字符串,我认为您的示例中的字节文字也会发生同样的情况。无论如何,我认为文档清楚地表明只有“字符串”可以用作文档字符串,因此字节对象与 int 或 bool 或任何其他非字符串一样糟糕的文档字符串似乎是合乎逻辑的数据类型。不过,我可以理解您的好奇心,尤其是因为 byte literals 和字符串文字在视觉上非常相似。

tl;博士:

Bytes 对象不是字符串,Python 文档字符串只能使用字符串。

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 2018-09-14
    • 2012-06-03
    • 1970-01-01
    • 2015-12-14
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多