3

以下が有効なのはなぜですか?

#!/usr/bin/python
def spam():
   pass

spam

関数がオブジェクトであることは理解していますが、上記のようなコードは決して役に立たず、常に間違いの結果であると思います。スパム関数オブジェクトを参照する行でエラーにならないのはなぜですか?

4

3 に答える 3

7

すべての式は有効なステートメントです。ローカル変数の使用は (それが何を参照していても) 有効な式です。遅延バインディングと動的性のため、コンパイル時にそれが関数を参照しているのか、それ以外のものを参照しているのかを検出できません (ただし、この場合、ローカルを参照するだけでは何も起こらないため、それを知る必要はありません)。実行時チェックは、利益がないのに非常にコストがかかります。

それはフォームの禁止ステートメントを残し<local variable>;ます。このケースを具体的に禁止することは一貫性がなく、余分な作業が必要であり、私見にはあまり役に立ちません。実行できなかった技術的な理由は見当たらないので、おそらく BDFL がこれに対する特別なケースを望んでいないことに帰着します。

于 2012-11-28T17:18:17.720 に答える
2

一般的なケースでは、裸の式を参照すると副作用が発生する可能性があります。コード:

class Nugget(object):
    @property
    def spam(self):
        print "does merely referencing a property invoke it?"

n = Nugget()
n.spam           # no explicit invocation

実際にメッセージを印刷します。例のケースでエラーを出すと、このケースの一般性が損なわれます。

于 2012-11-28T17:32:04.867 に答える
2

まず、spamspam()はもちろん根本的に異なるステートメントです。a = spamこれは と の違いを見れば明らかですa = spam()。1 つ目は variableaに関数を格納し、2 つ目はその瞬間に行われた関数の 1 つの呼び出しの戻り値を格納します。どちらも便利ですが、操作は異なります。

in のような関数について言及するだけでspamは、何か役に立つことはありません。しかし、Python では値を記述することは禁止されていません。あなたの議論に続いて、単一のステートメント4も、リテラル値と同様に違法である必要があります。pydoc 文字列は (実行の観点から) 役に立たない値の言及にすぎないため、これは実際にはどこでも pydoc 文字列を使用することを禁止します。

ですから、そのような裸の値を使用することは禁止されていた可能性があると思いますが、そうではなく、現在では使用さえあります.

于 2012-11-28T17:24:06.080 に答える