3

私は Python コンソールで何かを試していましたが、関数名と の間にスペースがいくつあってもかまわないことに気付きました()

>>> def foo():
...   print 'hello'
...
>>> foo ()
hello
>>> foo                ()
hello

そんなことがあるものか?それはある種の例外を発生させるべきではありませんか?

4

4 に答える 4

7

トークン間の空白に関する字句解析ドキュメントから:

論理行の先頭または文字列リテラルを除き、空白文字 space、tab、および formfeed は、トークンを区切るために同じ意味で使用できます。2 つのトークンの間に空白が必要になるのは、それらの連結が別のトークンとして解釈される可能性がある場合のみです (たとえば、ab は 1 つのトークンですが、ab は 2 つのトークンです)。

最後の文を逆にすると、2 つのトークンの間に空白を入れることができますが、空白のない 1 つのトークンとして解釈されるべきではありません。空白の使用量に制限はありません。

前のセクションでは、論理行を構成するものを定義しています。上記は、論理行内にのみ適用されます。以下も合法です。

result = (foo
                 ())

論理行が括弧によって改行を越えて拡張されるためです。

呼び出し式は、前のものとは別の一連のトークンです。fooは、グローバル名前空間で検索するための名前にすぎません。辞書からオブジェクトを検索したり、別の呼び出しから返されたりする可能性があります。そのため、この()部分は 2 つの個別のトークンであり、任意の量の空白が含まれます。これらの周りは許可されています。

于 2013-05-16T14:41:50.927 に答える
4

あなたはそれを理解する必要があります

foo()

Python では、 と の 2 つの部分で構成されfooます()

最初のものは、あなたの場合、globals()辞書にある名前で、それに関連付けられた値は関数オブジェクトです。

式の後の左括弧は、call操作を行う必要があることを意味します。たとえば、次のように考えてください。

def foo():
    print "Hello"

def bar():
    return foo

bar()()  # Will print "Hello"

したがって、彼らが理解する重要なポイントは、その()前にある式に適用できることです...たとえば、 -th 要素をmylist[i]()取得し、引数を渡さずに呼び出します。imylist

この構文では、式と(文字の間に任意のスペースを使用することもできますが、それについては何もおかしなことはありません。p . xたとえば、 mean と書くこともできることに注意してくださいp.x

于 2013-05-16T14:45:52.050 に答える
3

Python は、C プログラミング言語から多くの手がかりを得ています。これは確かにその一つです。以下がコンパイルされるという事実を考慮してください。

int add(int a, int b)
{
    return a + b;
}

int main(int argc, char **argv)
{
    return add        (10, 11);
}

関数名とその引数の間に任意の数のスペースを入れることができます。

これは他の言語にも当てはまります。たとえば、Ruby を考えてみましょう。

def add(a, b)
  a + b
end

add       (10, 11)

確かに警告が表示されますが、それでも機能します。方法はわかりませんが、警告は簡単に抑制できると確信しています。

于 2013-05-16T14:46:04.293 に答える
1

まったく問題ありません。先頭にスペースがあるかどうかにかかわらず、ある種のシンボルの名前と丸括弧の間にあるものは、問題のシンボル (この場合は関数定義) の名前を変更する可能性があります。

これは、さまざまな C ベースの言語でも一般的であり、関数名の末尾とパラメーター リストの間のスペースの埋め込みは問題なく実行できます。

于 2013-05-16T14:40:39.743 に答える