私はPythonプログラミングに慣れていません。Pythonの美しさはすべてがオブジェクトですが、なぜキーワードをオブジェクトにしないのですか?
>>> type(for)
File "<stdin>", line 1
type(for)
^
SyntaxError: invalid syntax
私はPythonプログラミングに慣れていません。Pythonの美しさはすべてがオブジェクトですが、なぜキーワードをオブジェクトにしないのですか?
>>> type(for)
File "<stdin>", line 1
type(for)
^
SyntaxError: invalid syntax
実際、演算子はオブジェクトです。operator
モジュールを見てみましょう。演算子オブジェクトを通常の名前で取得することはできませんが (Python の文法が非常に複雑になり、混乱を招くため)、これは機能します。
>>> import operator
>>> type(operator.add)
<type 'builtin_function_or_method'>
if
やなどのフロー制御キーワードfor
は、セマンティックがないためオブジェクトではありません。架空のfor
オブジェクトをどうしますか? for ループを置き換えることができる関数、つまりfilter
、map
、およびitertoolsreduce
のさまざまな関数があることに注意してください。
演算子とキーワードがオブジェクトではない理由は、それらが実際には言語の構文の一部であり、操作できる要素ではないためです。phihag が言ったように、仮想の「for」オブジェクトをどうしますか?
ただし、演算子はオブジェクトですが、「+」演算子は基本的にadd関数の構文糖衣にすぎないことを覚えておく必要があります。あなたが書くとき
a + b * c
Python が見ているもの (最適化を無視) は、より似ています
a.__add__(b.__mul__(c))
実際、数値でこれを試すことができます。
>>> (5).__mul__((3).__add__(10))
65
したがって、演算子「+」は、オブジェクトである (5).__ add__ 関数によって表されます。(数値リテラルは特殊な構文であるため、括弧を使用する必要があります。)
いくつかの混合メッセージが進行中です。Mark Pilgrim はEverything is an Objectと言っていますが、すべてがオブジェクトである言語でさえ、すべてがオブジェクトであるとは限りません。;)
Python では、クラスの特別な名前のメソッドを介して演算子のオーバーロードを行うことができます。モジュールも付いていoperator
ます。ただし、最終的には、モジュールのメンバーoperator
と特別な演算子クラス メソッドの両方が関数であり、したがってオブジェクトですが、 Python が読みやすさとセマンティクスを提供するために使用する裸の単語( など+
) は、常にオブジェクトとして解析できるとは限りません。
これは、キーワードには当てはまりません。などの一部のキーワードはif
、オブジェクトに要約されません。Dive Into Python のすべてという言葉を無視して、次の引用を覚えておくのがおそらく最善です。
文字列はオブジェクトです。リストはオブジェクトです。関数はオブジェクトです。モジュールでさえオブジェクトです。
キーワードは、Python 内の何かとして存在しません。構文エラーが発生しますが、そうでない場合でも、キーワードが存在しないため type(keyword) を実行できません。
例として、次のコードを取り上げます。
>>> from urllib2 import urlparse as foo
ここでは、構文の一部として「as」という単語が表示されます。キーワードです。
>>> type(as)
File "<stdin>", line 1
as
^
SyntaxError: invalid syntax
ただし、オブジェクトとして使用しようとすると、構文エラーが発生します。
しかし、2.4as
では予約語ではありません。そのため、次の点が異なります。
>>> from urllib2 import urlparse as foo
ここまでは順調ですね。
>>> type(as)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'as' is not defined
そこには、as
単に存在しないことがわかります。それは何もないので、オブジェクトではありません。言語はその存在を認識していません。これは、言語が実行前に何かを認識することができないためです。また、解析は実行前に行われます。したがって、構文とキーワードの解析は、「すべて」が存在する前に行われます。したがって、キーワードは「すべて」の一部ではなく、オブジェクトではありません。
発生する構文エラーは、キーワードを変数名として使用することによる間違いを防ぐためのものです。ただし、この場合、このエラーは、キーワードがオブジェクトではない理由がすぐにはわからないことを意味します。キーワードは何もないためです。