Tag: runtime
-
42. インポートロック
#42. インポートロック インポート ロックは、安全でない同時インポートを防止する同期機構です。 CPython では、インポートは名前の検索だけではありません。モジュールオブジェクトを作成したり、突然変異したりする可能性があります。 sys.modules 、任意の Python コードの実行、拡張モジュールの初期化、パッケージ属性の更新、ソース ファイルのコンパイル、バイトコード キャッシュの読み取り、パッケージ初期化コードの実行を行います。 ロックを行わないと、2 つのスレッドが同じモジュールを同時にインポートし、一貫性のないモジュール状態が観察される可能性があります。 インポートは実行であり、実行により共有ランタイム状態が変化するため、インポート ロックが存在します。 42.1 インポートにロックが必要な理由 このモジュールについて考えてみましょう。```python id="ez8v8a" cache.py print("initializing cache") items = {} def get(key): return items[key] ここで、これを同時に実行する 2 つのスレッドを考えてみましょう。 python id="2pklaf" import cache 同期がないと、両方のスレッドが次のような可能性があります。 text id="oy5qmp" create a module object insert or overwrite sys.modules["cache"] execute cache.py initialize items twice observe a partially initialized module bind different module objects ## 42.2 インポートによりグローバル ランタイム状態が変更される インポートは共有状態にタッチします。 重要な共有構造には次のものがあります。 ```text id="yxk2bl"…
-
43. 記述子
#43. 記述子 記述子は、別のオブジェクトの属性アクセスを制御するオブジェクトです。記述子は、Python のオブジェクト モデルの背後にある主要なメカニズムの 1 つです。メソッドがインスタンスにどのようにバインドされるかについて説明します。 property 動作、方法 staticmethod そして classmethod 動作、スロットの動作、および Python レベルの構文に接続する CPython レベルの型操作の数。 言語レベルでは、記述子は次のメソッドの 1 つ以上を定義するオブジェクトです。 python id="x7hcrg" __get__(self, obj, objtype=None) __set__(self, obj, value) __delete__(self, obj) オブジェクト __get__ 記述子です。 オブジェクト __set__ または __delete__ データ記述子です。 非データ記述子とデータ記述子の区別により、検索の優先順位が制御されます。 43.1 記述子が存在する理由 Python の属性アクセスは簡単に見えます。 python id="96l8i5" obj.name ただし、この式は「という名前のフィールドを読み取る」という意味ではありません。 name 記憶から。」 それは次のことを意味します:```text id="drqc0j" ask the object's type how attribute lookup works search descriptors and dictionaries in a defined order possibly call descriptor…
-
41. パッケージ
#41. パッケージ パッケージは、他のモジュールを含めることができるモジュールです。 CPython では、パッケージは独立したオブジェクト カテゴリではありません。これはまだモジュール オブジェクトですが、インポート システムにサブモジュールを探す場所を指示するインポート メタデータがあります。 Python レベルでは、このディレクトリをパッケージにすることができます。 text app/ __init__.py config.py server.py 次のようにインポートできます。 python import app import app.config from app.server import run 重要なルールはシンプルです。```text A package is a module with submodule search locations. ## 41.1 パッケージはモジュールです パッケージオブジェクトにはタイプがあります ` module ` 。 ``` python import email print ( type ( email )) print ( email . __name__ ) ``` 出力: ``` text < class 'module' > email ```…
-
40. モジュールとインポート
#40. モジュールとインポート モジュールは、コードの読み込み、名前空間の分離、再利用の Python の基本単位です。 CPython では、モジュールは言語レベルのオブジェクトであると同時に、インポート システムのランタイム レコードでもあります。 Python レベルでは、モジュールは以下を実行した後に得られるものです。 python import math import os import json インポートされた各名前は、モジュール オブジェクト、パッケージ オブジェクト、関数、クラス、またはその他のエクスポートされたオブジェクトにバインドされます。 CPython レベルでは、インポートはバイトコード命令、インポート フック、モジュール仕様、ローダー、ファインダー、 sys.modules 、パッケージ パス、ファイル システム ルックアップ、バイトコード キャッシュ、インポート ロック、モジュールの実行。 インポート システムは、単純なファイル インクルード メカニズムではありません。ランタイムプロトコルです。 40.1 モジュールとは何か モジュールは次のタイプのオブジェクトです。 module 。```python import sys print(type(sys)) print(sys. name ) 出力: text <class 'module'> sys モジュール オブジェクトは辞書を所有します。その辞書はモジュールのグローバル名前空間です。 python import math print(math. dict ["pi"]) print(math. dict ["sqrt"]) という名前のファイルの場合、 ` config . py ` : ```…
-
44. クラスとメタクラス
#44. クラスとメタクラス クラスは、Python オブジェクト モデルを通じてインスタンスを作成し、属性を保存し、継承に参加し、動作を定義するランタイム オブジェクトです。 CPython では、クラスは通常、型が次のようなオブジェクトです。 type 。 メタクラスはクラスのクラスです。これは、クラス オブジェクトの作成、初期化、表現、呼び出しの方法を制御します。 通常クラスの場合:```python id="g3fkzi" class User: pass print(type(User)) 出力: text id="iqt3cc" <class 'type'> ```これはつまり User はオブジェクトであり、その型は type 。 44.1 クラスはオブジェクトである クラス定義によりクラス オブジェクトが作成されます。```python id="8zc5m6" class User: name = "anonymous" def hello(self): return "hello" 処刑後は、`User`周囲の名前空間にバインドされた通常の名前です。 python id="rx6c1m" print(User) print(type(User)) print(User. name ) print(User. dict ) クラス オブジェクトには次のような属性が格納されます。 text id="xxewj0" name qualname module dict bases mro methods descriptors class variables annotations ## 44.2…