2016-12-14 8 views
0

なぜPythonはこのコードを受け入れるん:ドキュメンテーション文字列がなぜpythonはdocstringを字下げする必要がありますか?

def is_right_triangle(leg1,leg2,hypotenuse): 
"""function for checking whether or not set of points makes a right triangle""" 
    return leg1 ** 2 + leg2 ** 2 == hypotenuse ** 2 

をインデントされていないところ

def is_right_triangle(leg1,leg2,hypotenuse): 
    """function for checking whether or not set of points makes a right triangle""" 
    return leg1 ** 2 + leg2 ** 2 == hypotenuse ** 2 

が、このコードでは、エラー「インデントブロックを期待」がスローされます。

なぜdocstringがインデントされているかどうかを気にするのですか?

+0

docstringは実際の文字列であり、インデントはPythonで重要です。 –

+0

つまり、pythonはdocstringを関数の一部とみなします。 – Tookie345

+0

これは単なる文字列です。もちろん、関数に関連付けられていますが、ポイントはPythonの構文規則に従って解析する必要があるということです。 –

答えて

4

docstringは関数内の別の式なので、特別な方法で扱われるのは、それが文字列と最初の式だからです。そのため1990年代のパイソンの先頭に

> a=ast.parse('def f(x):\n "docstring"\n return 0') 
> a.body[0].body 
[<_ast.Expr at 0x7f18bb3e6a20>, <_ast.Return at 0x7f18bb3e6550>] 
> a.body[0].body[0].value.s 
'docstring' 
1

、グイド・ヴァンロッサムは、関数定義内のすべての文はインデントとことをしなければならないことを命じ:

また、機能のASTを取得することであることがわかりますstringは式文でした。

GvRだけが本当にこの質問に答えることができます。 Pythonは、ABCというおもちゃの言語に由来します。 docstringはすでにABCでインデントされている可能性があります。

+0

文字列*は*表現式です。あなたが好きではない場合は、自由に#の前にスティックしてコメントにすることができます。もちろんそれは正式なdocstringではありません。 #pragmaのように、特定のコメントを特別なものとして扱う他の言語やドキュメントシステムがあります。私はPythonの方が好きです。 – nigel222

+0

@ nigel222私はそれが好きではないと言っているわけではありません.GvRの頭に書かれているすべての議論が、文法にこの構文を持つべきだと決めたときだけです。 ABCからコメントの癖があるかもしれません。 – Gribouillis

+0

@Griboulisあまりにも個人的に来た申し訳ありません。私の指摘は、言語上の構文は、コード内の他の場所にある式ステートメントだけで、行の文字列がそれ自身と同じように、docstringが定義によって式ステートメントであることを意味します。また、コメントではなくステートメントとして、適切にインデントされなければなりません。 – nigel222

関連する問題