web-dev-qa-db-ja.com

関数定義に三重引用符を含む文字列リテラル

Pythonチュートリアルに従い、ある時点で、関数の最初のステートメントがどのように文字列リテラルになりうるかについて話します。この例では、この文字列リテラルは三 "s、 で与える

"""Print a Fibonacci series up to n."""

このドキュメントによると、これは主に何らかの種類の自動生成ドキュメントを作成するために使用されます。

だから私はここの誰かが私にこれらの文字列リテラルが何であるかを正確に説明できるかどうか疑問に思っていますか?

53
Estarius

あなたが話している(私が思うに)ものは docstrings と呼ばれています(リンクについてBoudに感謝します)。

_def foo():
    """This function does absolutely nothing"""
_

インタープリターからhelp(foo)と入力すると、関数に入れた文字列が表示されます。 _foo.__doc___でその文字列にアクセスすることもできます

もちろん、文字列リテラルはまさにそれです-リテラル文字列です。

_a = "This is a string literal"  #the string on the right side is a string literal, "a" is a string variable.
_

または

_foo("I'm passing this string literal to a function")
_

それらは多くの方法で定義できます:

_'single quotes'
"double quotes"
""" triple-double quotes """  #This can contain line breaks!
_

あるいは

_#This can contain line breaks too!  See?
''' triple-single 
    quotes '''
_
63
mgilson

さて、式、リテラル、および文字列の概念を確認すると役立ちます。

文字列、式、およびリテラル

プログラムでは、さまざまなtypesのデータを表す必要があります。 typeのデータは整数です。他のタイプは浮動小数点数です。

あるタイプの値は、さまざまな方法、つまり、さまざまなexpressionsによって得られます。 expressionは、値を「作成する」プログラムのスニペットです。たとえば、以下のPython式は値4を生成し、変数に入れます。値はexpression _2+2_によって生成されました:

_i = 2+2
_

上記のステートメントを考えると、下のexpressionは同じ値4になりますが、この式にはvariableのみが含まれます。

_i
_

以下では、算術式で値を生成し、変数(これも式です)で値を取得しました。

ただし、言語は、基本的な値を直接生成する構文を提供する必要があります。たとえば、上の式の_2_は値2を取得します。基本的な値を直接生成する式は、literalsと呼ばれます。式_2+2_と_4_は両方とも同じ値4を生成しますが、2番目の式はそれを直接生成するため、リテラルです。

文字列リテラルと複数行の文字列

非常に重要なタイプのデータは、テキスト、文字、数字、その他の文字のシーケンスです。通常、このタイプはstringと呼ばれます。

string literalは、このように、文字列を生成するリテラルです。 Pythonでは、これらのリテラルはさまざまな方法でマークされます(つまり、文字列リテラルには多くの構文があります)。たとえば、リテラルの先頭または末尾に一重引用符または二重引用符を付けることができます。

_"A string literal"

'Another string literal'
_

他の方法は、3つの一重引用符または二重引用符を同じ位置に配置することです。この場合、リテラルは複数の行にまたがることができます。

_"""A single line string literal"""

"""A multiline
string literal"""

'''Another multiline
string literal'''
_

文字列リテラルに対してどのような構文を選択しても、その値は変更されないことに注意してください。単一引用符で囲まれた文字列は、同じ文字を含む二重引用符で囲まれた文字列と等しく、3引用符で囲まれた文字列は、同じコンテンツを含む1引用符で囲まれた文字列と等しくなります。

_>>> "A single line string literal" == 'A single line string literal'
True

>>> """A single line string literal""" == "A single line string literal"
True

>>> # \n is the character that represents a new line
>>> "A multiline\nstring literal" == """A multiline
string literal""" 
True
_

Docstringsとなぜ文字列リテラルにする必要があるのか

ドキュメントが言っていることは、メソッド宣言の直後に文字列リテラルを置くことができ、このリテラルがドキュメントとして使用されることです-docstringを呼び出すために使用するもの。単一引用符または二重引用符で囲まれた文字列、または単一引用符で囲まれた文字列または3引用符で囲まれた文字列のいずれを使用しても問題ありません。単にliteralである必要があります。

以下の機能を検討してください。

_def f1(value):
    "Doc for f1"
    return value + 1

def f2(value):
    """Doc for f2"""
    return value + 2
_

ここで、python console)でそれらを宣言し、help(f1)およびhelp(f2)を呼び出します。文字列リテラルの構文は重要ではないことに注意してください。

OTOH、ドキュメントの生成に、変数や文字列に対する操作など、他の式を使用することはできません。したがって、以下の関数の最初の行の文字列docstringはありません

_mydoc = "This is doc"
def f3(value):
     mydoc
     return value+3

 def f4(value):
     "This is no documentation " + "because it is concatenated"
     return value+4
_

コンパイラ明示的に記述されたをドキュメントとして管理するため、リテラルにする必要があります。ただし、コンパイラは変数、複雑な式などをドキュメントとして管理する準備ができていないため、それらは無視されます。つまり、設計によるものです。

なぜ三重引用符文字列をdocstringとして使用するのですか?

任意の形式の文字列リテラルをdocstringsで使用できますが、ドキュメントには通常、複数の行と段落を含む非常に長いテキストが含まれていると考えることができます。まあ、それは多くの行を含むので、複数行を受け入れるリテラル形式を使用する方が良いでしょう?これが、トリプルクォート文字列がdocstringを書くのに好ましい(しかし必須ではない)理由である理由です。

マージナルノート

実際、Python関数の任意の場所に文字列リテラルを置くことができます:

_ def flying_literals(param):
    "Oh, see, a string literal!"
    param += 2
    "Oh, see, ANOTHER string literal!"
    return param
    "the above literal is irrelevant, but this one can be still MORE IRRELEVANT"
_

ただし、最初の行のリテラルのみが何らかの違いをもたらします(ドキュメントであること)。他の操作は、操作なしの操作のようなものです。

34
brandizzi

文字列リテラルは、単にソースコードで文字通り与えられた文字列です。 docstringか別の文字列かは関係ありません。詳細については 文字列リテラルに関するPython言語のドキュメントセクション を参照してください。ただし、おそらくこれらの詳細は今は必要ありません。

いくつかの例:

"abc"
'Guido'
r"""Norwegian Blue"""
7
Sven Marnach

文字列リテラルは、多くの引用オプションの1つにある文字列であり、変数に割り当てられていません。

そう、

"String" # string literal
'string' # string literal
"""
  Multiline
  String
  Literal
"""
foo = "string variable"

defブロックの直後に文字列リテラルがある場合、そのメソッドのドキュメントの一部になり、docstringと呼ばれます

def foo(hello):
    """This is part of the documentation for foo"""

これはあなたがそれを使用する方法です:

>>> def foo(hello):
...     """This is the docstring"""
...     pass
... 
>>> foo.__doc__
'This is the docstring'
7
Burhan Khalid

Pythonでは、文字列を複数の行に分割する方法がいくつかあります。たとえば、文字列リテラルはその1つです。

s = """Hello,
    world"""
print(s)
>>> Hello,
>>>     world #Notice, that spaces used in the literal are kept.

しかし、あなたが正しく気づいたように、文字列リテラルは通常、インラインドキュメント用にあります

class MyClass(object):
    """This is my class it does this and that.

       It has some cool features and I may tell you about them below.
    """

    def my_method(self):
        """This is a brief description of my method."""

    def important_method(self):
        """Because this method is important, I'm going to tell you
           a lot about it. For example...
        """

質問する前に、文字列を複数の行に分割する良い方法は、神聖なPython=括弧:

s = ('This is a very very long string. '
     'I have to split it to multiple lines. '
     'Whoa! It works!')
print(s)
>>> This is a very very long string. I have to split it to multiple lines. Whoa! It works!

「1行あたり80文字を超えてはならない」というPEP-8に従うために、これが必要になる場合があります。

ハッピーPythonハッキング!

4
Zaur Nasibov

それらは、周囲に'"'''、または"""のペアを持つ他の文字列と同様の文字列です。
推奨される形式は、三重二重引用符です。

def some_function(s):
    """this is documentation for some_function"""
    print(s)
1
Anthon