2016-11-20 1 views
2

なぜバイト文字列b'string'をクラスや関数のdocstringとして使うことができないのでしょうか(と私はモジュールを推測しています)。点でバイト文字列をDocstringとして使用できないのはなぜですか?

ケース:機能と同様

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

r''の場合、u''(期待)文字列は問題ありません。私はドキュメンテーションで何も見つけることができませんでした。これがなぜなのか?

+6

おそらく実際にはテキストではないからです。 –

答えて

1

としてはb'string'がテキストではない、またはより具体的には、文字列ではありません、それはbytes objectある、と私はあなたがこれらのバイト列」と呼ばれるでしょうとは思わない、IgnacioVazquez-エイブラムス @によって指摘しました"どこでもPythonドキュメント(私は間違っているかもしれませんが)。実際、これは個人的に私と矛盾しているように思えます。

一方、r''u''および''はそれぞれ文字列(生の文字列リテラル、Unicode文字列リテラル、および文字列リテラル)です。 the spec for docstringsの最初の文は、次のとおりです。

docstringは、モジュール、関数、クラス、またはメソッド定義の最初の文として使用される文字列リテラルです。そのようなdocstringは、そのオブジェクトの特殊属性である__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; DR:

バイトのオブジェクトは、文字列ではなく、唯一の文字列はPythonのdocstringのために使用することができます。

関連する問題