2017-03-20 10 views
12

方法は、基礎となる関数が呼び出されたときに渡されるインスタンスを保持する属性、__self__を、持っています。どうやら、組み込み関数もそうです。一方で、彼らはNoneを保持し、Pythonの2では組み込み関数の__self__が、それが属する組み込みモジュールを返すのはなぜですか?

>>> len.__self__ 
<module 'builtins' (built-in)> 
>>> sys.getrefcount.__self__ # also for other builtin modules 
<module 'sys' (built-in)> 

:Pythonの3では

は、彼らがモジュールオブジェクトを保持矛盾がここにありますなぜ

>>> type(len.__self__) 
<type 'NoneType'> 
>>> sys.getrefcount.__self__ 
<type 'NoneType'> 

は誰でも知っていますか?それに加えて、なぜこれらも__self__を持っていないと__self__属性が不足しているPythonのレベルのモジュールの機能を好きではないされています

>>> from pprint import pprint 
>>> pprint.__self__ 
AttributeError: 'function' object has no attribute '__self__' 
+1

彼らは組み込み関数は(通常の)内蔵方法とタイプを共有するため 'self'を有し、内蔵の方法' __self__'を有します。しかし、なぜPython 3では '__self__'が' None'でないのか分かりません。 – user2357112

+1

私はそれが意図的ではなかったと思うし、彼らはただその変更に気付かなかったが、私は言うことができない。ソースにはそれに関するコメントはないようで、それに関するメーリングリストの会話が見つからないか、それを証明することは難しいでしょう。 – user2357112

+0

@ user2357112私はそれらが実際に同じオブジェクトであることに気づくべきでした、私は本当に*私がそれを逃したとは信じられません。ありがたいことに、少なくともトラッカーを掘り下げて最初の部分についての説明を見つけましたが、 'Python 3'では' self'が 'None'にならないという奇妙な選択のようです。 –

答えて

8

私はissue14003に矛盾のおかげ理由を見つけたと信じています。 Py_InitModule4を持つモジュールの建設中に、PyObject *self引数はwrittersの場合Noneの値を持つことができますが利用可能だった、それは、Python 2では3へのPython 2からモジュール作成のAPIの変更

によるものであると思われます文書化されているように拡張子モジュールは、望んだ:selfNULL非で

場合、それは彼ら(そうでないNULL)最初のパラメータとしてのモジュールの関数に渡されます

建てのほとんどをapparently chose that path標準ライブラリモジュール-inとbuiltin_function.__self__のような結果がNoneあるよう:

のPython 3では
mod = Py_InitModule4("__builtin__", builtin_methods, 
        builtin_doc, (PyObject *)NULL, 
        PYTHON_API_VERSION); 

、モジュールを作成するためのAPIが変更され、そのオプションが消えました。モジュールを作成するための関数PyModule_Create2は、Noneであることができるself引数をとらない。代わりに、(モジュールに機能を追加するために、内部_add_methods_to_objectを呼び出す)と無条件モジュールであることが組み込み関数に__self__属性を設定PyModule_AddFunctionsを呼び出します。

lenためbuiltinsモジュールが返されだから、なぜです。それの目的は、どのような方法で特別なものではありませんので、私の知る限り、それはどこにでも関数本体内部に使用されていません。私は愚か感じることのために、@ user2357112へ


小道具の組み込み関数はメソッドで見つかった__self__属性を共有するため、builtin_methodbuiltin_functionが実際the same structあるので、それは理にかなっています。

functionタイプは、methodタイプとは全く共有されていないため、実際には持っていません。

関連する問題