26
class SomeThing(object):
    """Represents something"""

    def method_one(self):
        """This is the first method, will do something useful one day"""

    def method_two(self, a, b):
        """Returns the sum of a and b"""
        return a + b

上記に似たコードの最近のレビューで、同僚が次のように尋ねました。

method_onePythonによって正常に解析および受け入れられるのはなぜですか? 空の関数には、 だけで構成される本体が必要ではありませpassんか? つまり、このように見えるべきではありませんか?

def method_one(self):
    """This is the first method, will do something useful one day"""
    pass

その時の私の反応は次のようなものでした。

docstring は通常、関数本体の一部とは見なされませんが、「実行」されないため、そのように解析されるため、pass省略できます。

知識を Q&A スタイルで共有するという精神で、より厳密な回答をここに投稿すると思いました。

4

1 に答える 1

21

パーサー ジェネレーターによって読み取られ、Python ソース ファイルの解析に使用されるPython 2.7.5 grammar specificationによると、関数は次のようになります。

funcdef: 'def' NAME parameters ':' suite

関数本体は次のsuiteようになります

suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT

これに文法全体を通して従うstmtことができexpr_stmt、それはただの でtestlistあることができ、それはただの であり、 test(最終的には) はただのatomであり、それはただの であることができますSTRING。ドキュメント文字列。

以下は、文法の適切な部分だけを正しい順序で示したものです。

stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt |
             import_stmt | global_stmt | exec_stmt | assert_stmt)
expr_stmt: testlist (augassign (yield_expr|testlist) |
                     ('=' (yield_expr|testlist))*)
testlist: test (',' test)* [',']
test: or_test ['if' or_test 'else' test] | lambdef
or_test: and_test ('or' and_test)*
and_test: not_test ('and' not_test)*
not_test: 'not' not_test | comparison
comparison: expr (comp_op expr)*
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
shift_expr: arith_expr (('<<'|'>>') arith_expr)*
arith_expr: term (('+'|'-') term)*
term: factor (('*'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power
power: atom trailer* ['**' factor]
atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [listmaker] ']' |
       '{' [dictorsetmaker] '}' |
       '`' testlist1 '`' |
       NAME | NUMBER | STRING+)
于 2013-07-18T22:36:36.483 に答える