ホームページ  >  記事  >  バックエンド開発  >  上位レベルのディレクトリ モジュールへのインポートと Python での循環インポートの問題

上位レベルのディレクトリ モジュールへのインポートと Python での循環インポートの問題

高洛峰
高洛峰オリジナル
2017-03-03 15:20:441948ブラウズ

上位ディレクトリにモジュールをインポートします

Pythonでは、インポートモジュールはsys.pathを検索します。sys.pathはリストであり、動的に変更できます。
特定のディレクトリにモジュールをインポートするには、sys.path.insert(0,somedir) を使用して検索パスを追加してからインポートします。
この場合、上位ディレクトリにモジュールをインポートしたい場合は、sys.path.insert(0,parentdir) を使用できます。
ただし、ファイルが他の場所に配置されている場合、絶対パスを記述するこの方法は機能しません。
そのため、動的メソッドを使用して上位レベルのディレクトリを取得します。

import os,sys 
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
sys.path.insert(0,parentdir)

sys.path.append(parentdir)の代わりにsys.path.insert(0,parentdir)を使用する理由
検索パスがトラバースされるため、他のパスに同じ名前の名前がある場合paths モジュールを使用すると、インポート エラーが発生します。 sys.path.insert(0,parentdir) を使用して、このパスが最初に検索されるようにします。

循環インポートの問題を解決する
Pythonでは、循環インポート、つまり循環インポートの問題によく遭遇します。
このおかしな状況は現実によく起こります。
ワイヤレス ネットワーク カードをインストールするときは、オンラインにアクセスしてネットワーク カード ドライバーをダウンロードする必要があります。
圧縮ソフトウェアをインストールする場合、インターネットからダウンロードした圧縮ソフトウェア インストール プログラムは実際には圧縮されています。 .
ループの依存関係は次のとおりです。
たとえば、
models.py では、

from server import db 
class User(db.Model): 
  pass

server.py では、

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 
from models import User

これにより、循環インポートの問題が発生します。
循環インポートの問題を解決するには、いくつかの主な方法があります。
1. 遅延インポート
インポート ステートメントをメソッドまたは関数に記述して、スコープをローカル領域に制限します。
この方法の欠点は、パフォーマンスの問題が発生することです。
2. xxx import yyy から import xxx;xxx.yyy に変更してアクセスします
3. コードを整理します
循環インポートの問題は、多くの場合、コードのレイアウトに問題があることを意味します。
競合するリソースは結合または分離できます。
マージすると、すべてを1つのファイルに書き込むことができます。
分離とは、サードパーティのファイルにインポートする必要があるリソースを抽出することを意味します。
要するに、ループを一方向に変えます。

上位レベルのディレクトリ モジュールのインポートと Python での循環インポートの問題に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。