Pythonでimportは前のレベルのディレクトリモジュールと循環import問題の解決を導入します。

1701 ワード

import上のレベルのディレクトリのモジュール
pythonでは、import moduleはsys.path検索に行きます。sys.pathはリストで、動的に修正できます。
importのあるディレクトリのmoduleにします。私達はsys.path.insert(0、somedir)で検索パスに参加すれば、importができます。
それなら、importの上のクラスのディレクトリのmoduleを要して、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.insert(0,parentdir)を使ってsys.path.appndではないですか?
検索パスを巡回していますので、他の経路にも同じ名前のmoduleがあったら、importが間違っています。sys.path.insert(0,parentdir)を使うと、まずこの経路を検索することができます。
循環importの問題を解決します。
pythonでは循環importであるcircuular importという問題に遭遇することが多いです。
現実にはよくこのような滑稽な状況が現れます。
Wi-Fiカードをインストールする時、インターネットでネットカードのドライバをダウンロードします。
圧縮ソフトをインストールする時、ネットからダウンロードした圧縮ソフトのインストールプログラムは圧縮されました。
循環依存性はこのような状況に似ている。
くりを一つあげる
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 
これにより循環importの問題が発生した。
循環importを解決する方法は主にいくつかあります。
1.遅延導入(lazy import)
import文を方法や関数に書いて、そのスコープを局部に制限します。
この方法の欠点は性能の問題があることです。
2.from xxx import yyをimport xxxに変更します。xxx.yyが訪問する形式
3.組織コード
循環importが発生する問題は、コードのレイアウトに問題があることを意味します。
競合するリソースを統合または分離することができます。
合併とは、一つの書類の中に書いてあります。
分離するとimportが必要な資源を第三者ファイルに抽出します。
つまりサイクルを一方にすることです。