60

私は Python チュートリアルに従っていますが、ある時点で、関数の最初のステートメントを文字列リテラルにする方法について話しています。例に関する限り、この文字列リテラルは 3 つ"の s で行われているようです。

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

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

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

4

6 に答える 6

71

あなたが話していること(私は思う)は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 '''
于 2012-05-31T19:56:24.197 に答える
37

そうですね、式、リテラル、および文字列の概念を確認することは役に立ちます。

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

プログラムでは、さまざまな種類のデータを表現する必要があります。データのタイプの1 つは整数です。別のタイプは浮動小数点数です。

あるタイプの値は、さまざまな方法で、つまりさまざまなを通じて生成できます。は、値を「作成」するプログラムの断片です。たとえば、以下の Python 式では、 2+2は値 4 を生成します。代入演算子は、生成=された値 4 を という名前の変数に入れますi

i = 2+2

上記のステートメントを考えると、以下のは同じ値 4 を生成しますが、この式には変数のみが含まれています。

i

以下では、算術式によって値を生成し、次に変数(これも式です) によって値を生成しました。

ただし、言語は、基本的な値を直接生成する構文を提供する必要があります。たとえば、2上記の式の は値 2 を取得します。基本的な値を直接生成する式はリテラルと呼ばれます。どちらの式も2+2同じ4値 4 を返しますが、2 番目の式は言語によって提供される操作を表す非常に基本的な方法であり、明示的な操作を実行する必要がないため、リテラルです。

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

非常に重要なタイプのデータは、テキスト、一連の文字、数字、およびその他の文字です。この型は通常stringと呼ばれます。

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

"A string literal"

'Another string literal'

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

"""A single line string literal"""

"""A multiline
string literal"""

'''Another multiline
string literal'''

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

>>> "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 と、それらが文字列リテラルであるべき理由

ドキュメントが言っていることは、メソッド宣言の直後に文字列リテラルを置くことができ、このリテラルがドキュメントとして使用されるということです。一重引用符または二重引用符で囲まれた文字列を使用するか、または一重引用符または三重引用符で囲まれた文字列を使用するかは問題ではありません。リテラルである必要があるだけです。

以下の関数を検討してください。

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

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

次に、Python コンソールでそれらを宣言し、 and を呼び出し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 で使用できますが、ドキュメントには通常、複数の行や段落を含む非常に長いテキストが含まれていると考えるかもしれません。うーん、行数が多いので、複数行を受け入れるリテラル形式の方がいいですね。これが、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"

ただし、最初の行のリテラルだけが違いを生みます(ドキュメントです)。他のものはno-opsです。

于 2012-05-31T20:25:09.647 に答える
8

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

いくつかの例:

"abc"
'Guido'
r"""Norwegian Blue"""
于 2012-05-31T19:56:11.903 に答える
7

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

それで、

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

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

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'
于 2012-05-31T19:57:24.110 に答える
5

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 のハッキングをお楽しみください。

于 2012-05-31T20:05:14.693 に答える
1

'それらは、、、またはのペア"を持つ他の文字列と同様の文字列です。 推奨される形式は、トリプルダブルクォートです。'''"""

def some_function(s):
    """this is documentation for some_function"""
    print(s)
于 2012-05-31T19:57:14.900 に答える