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