私は Python コンソールで何かを試していましたが、関数名と の間にスペースがいくつあってもかまわないことに気付きました()
。
>>> def foo():
... print 'hello'
...
>>> foo ()
hello
>>> foo ()
hello
そんなことがあるものか?それはある種の例外を発生させるべきではありませんか?
私は Python コンソールで何かを試していましたが、関数名と の間にスペースがいくつあってもかまわないことに気付きました()
。
>>> def foo():
... print 'hello'
...
>>> foo ()
hello
>>> foo ()
hello
そんなことがあるものか?それはある種の例外を発生させるべきではありませんか?
トークン間の空白に関する字句解析ドキュメントから:
論理行の先頭または文字列リテラルを除き、空白文字 space、tab、および formfeed は、トークンを区切るために同じ意味で使用できます。2 つのトークンの間に空白が必要になるのは、それらの連結が別のトークンとして解釈される可能性がある場合のみです (たとえば、ab は 1 つのトークンですが、ab は 2 つのトークンです)。
最後の文を逆にすると、2 つのトークンの間に空白を入れることができますが、空白のない 1 つのトークンとして解釈されるべきではありません。空白の使用量に制限はありません。
前のセクションでは、論理行を構成するものを定義しています。上記は、論理行内にのみ適用されます。以下も合法です。
result = (foo
())
論理行が括弧によって改行を越えて拡張されるためです。
呼び出し式は、前のものとは別の一連のトークンです。foo
は、グローバル名前空間で検索するための名前にすぎません。辞書からオブジェクトを検索したり、別の呼び出しから返されたりする可能性があります。そのため、この()
部分は 2 つの個別のトークンであり、任意の量の空白が含まれます。これらの周りは許可されています。
あなたはそれを理解する必要があります
foo()
Python では、 と の 2 つの部分で構成されfoo
ます()
。
最初のものは、あなたの場合、globals()
辞書にある名前で、それに関連付けられた値は関数オブジェクトです。
式の後の左括弧は、call
操作を行う必要があることを意味します。たとえば、次のように考えてください。
def foo():
print "Hello"
def bar():
return foo
bar()() # Will print "Hello"
したがって、彼らが理解する重要なポイントは、その()
前にある式に適用できることです...たとえば、 -th 要素をmylist[i]()
取得し、引数を渡さずに呼び出します。i
mylist
この構文では、式と(
文字の間に任意のスペースを使用することもできますが、それについては何もおかしなことはありません。p . x
たとえば、 mean と書くこともできることに注意してくださいp.x
。
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)
確かに警告が表示されますが、それでも機能します。方法はわかりませんが、警告は簡単に抑制できると確信しています。
まったく問題ありません。先頭にスペースがあるかどうかにかかわらず、ある種のシンボルの名前と丸括弧の間にあるものは、問題のシンボル (この場合は関数定義) の名前を変更する可能性があります。
これは、さまざまな C ベースの言語でも一般的であり、関数名の末尾とパラメーター リストの間のスペースの埋め込みは問題なく実行できます。