モジュール
モジュールは、定義したすべての関数と変数を含むファイルであり、その接尾辞は.pyです。モジュールは、他のプログラムによって導入され、モジュール内の関数や他の関数を使用できます。これは、Python標準ライブラリを使用する方法でもあります。モジュールに書き込まれた再利用可能な関数をカプセル化して、Pythonネイティブライブラリに公開できます。次に、作成したモジュールを他のプログラムにインポートできます。簡単に言えば、モジュールは一般的に使用される部品のようなものです。たとえば、ガンダムモデルを組み立てるときは、既製の部品を取り出して組み立て速度を上げることができます。部品を自分で作る必要がある場合は、はるかに遅く、難しくなります。標準ライブラリのモジュールはPythonに付属しているパーツであり、使用できます。独自のモジュールを開発することもできます。自分で開発したモジュールをローカルに公開すると、標準ライブラリのモジュールと同じように使用できます。
以下は、python標準ライブラリのモジュールの使用例です。
import sys #インポートされたモジュールのキーワードはimportです。ここでは、sysモジュールがインポートされます。
print("コマンドラインパラメータは次のとおりです:")for i in sys.argv: #その中の変数または関数は、モジュールを介して呼び出すことができます
print(i)print("\n\nPythonパスは次のとおりです。")for path in sys.path:print(path)
操作結果:
コマンドラインのパラメータは次のとおりです。
E:/PythonProject/TestMould.py
Pythonパスは次のとおりです。
E:\PythonProject
E:\PythonProject
E:\Python3.6\python36.zip
E:\Python3.6\DLLs
E:\Python3.6\lib
E:\Python3.6
E:\Python3.6\lib\site-packages
1、 import sys import sys.pyモジュールをpython標準ライブラリにインポートします。これは、特定のモジュールをインポートする方法です。
2、 sys.argvは、コマンドラインパラメータのリストです。
3、 sys.pathには、Pythonインタープリターが必要なモジュールを自動的に見つけるパスのリストが含まれています。
importステートメントは、Pythonライブラリにモジュールをインポートするために使用されます。モジュールはインポート後に使用できます。構文は次のとおりです。
import module1[, module2[,… moduleN]
インタプリタがimportステートメントを検出すると、モジュールが現在の検索パスにある場合はモジュールがインポートされます。検索パスは、インタプリタが事前に検索するすべてのディレクトリのリストです。
例:PyCharmツールでmodel.pyファイルを作成します。このファイルはモジュールと同等であり、ファイル内の関数をカスタマイズできます。
次に、Hello.pyファイルを作成します。このファイルでは、このモジュールをインポートしてインポートでき、このモジュールの関数をインポートしたモジュールから呼び出すことができます。
# Filename: Hello.py
# インポートモジュール
import model
# これで、モジュールに含まれている関数を呼び出すことができます
model.println()
動作結果:
Test!
関数を頻繁に使用する予定がある場合は、それを変数に割り当てることができます。
import model
println=model.println
println()
動作結果:
Test!
上記の例は、カスタムモジュールを作成およびインポートするプロセスに属しています。
モジュールは、実行するimportステートメントの数に関係なく、一度だけインポートされるため、インポートされたモジュールが何度も実行されるのを防ぎます。
importステートメントを使用する場合、Pythonインタープリターはどのようにして対応するファイルを見つけますか?
これには、Python検索パスが含まれます。
これは環境変数によく似ています。実際、環境変数を定義することで検索パスを決定することもできます。
簡単な実験を行って、Pythonの検索パスを表示できます。コード例:
import sys
print(sys.path) #ディレクトリリストを印刷する
動作結果:
[ ‘E:\PythonProject’, ‘E:\PythonProject’, ‘E:\Python3.6\python36.zip’, ‘E:\Python3.6\DLLs’, ‘E:\Python3.6\lib’, ‘E:\Python3.6’, ‘E:\Python3.6\lib\site-packages’]
sys.pathはリストを返します。ここで、最初の項目は現在のディレクトリを表し(インタプリタから実行された場合、空の文字列になります)、これは.pyファイルが配置されているパスです。
Pythonのfromステートメントを使用すると、指定した関数または変数をモジュールから現在のスクリプトにインポートできます。構文は次のとおりです。
from modname import name1[, name2[, … nameN]]
たとえば、モデルモジュールのprintln関数をインポートするには、次のコード例を使用します。
from model import println
println()
このステートメントは、モデルモジュール全体を現在のスクリプトにインポートするのではなく、モデル内のprintln関数のみをインポートするため、この関数を直接呼び出すことができます。
複数の関数または変数をインポートする場合は、コンマを使用してそれらを区切る必要があります。
モジュールのすべての内容を現在のスクリプトにインポートすることができます。次のステートメントを使用するだけです。
from modname import *
これにより、モジュール内のすべてのアイテムを簡単にインポートできます。ただし、このステートメントはあまり使用しないでください。
各モジュールまたはスクリプトファイルには、Java、C / C ++、およびC#のmainメソッドと同様に、メインプログラムまたはコード実行の開始点があります。スクリプトの実行中は、メインプログラムが実行されます。このメインプログラムは、実行時に名前が割り当てられますが、名前は固定されていません。たとえば、スクリプトとして実行される場合、メインプログラムの名前は*** _ main _ であり、別のスクリプトで実行されます。インポートされたモジュールに対して実行される場合、メインプログラムの名前はモジュールの名前です。また、各スクリプトには独自の _ name _ ***属性があり、この属性の値は現在のメインプログラムの名前に対応しています。次に、実際の例を示します。
# filename:TestMould.py
if __name__ =='__main__': #スクリプトとして実行されたときのメインプログラムの名前は__main__
print(__name__)print("私は現在のスクリプトとして実行されました")else:print(__name__)print("別のスクリプトでモジュールとして実行されました")
動作結果:
*** main***
プログラム自体が実行されています
別のスクリプトでモジュールとして実行された場合、*** _ name _ 属性の値は _ main _ ***ではありません。
# filename:Hello.py
import TestMould #別のスクリプトのインポートモジュールとして実行される場合、メインプログラムの名前はモジュールの名前になります
動作結果:
TestMould
別のスクリプトでモジュールとして実行されました
注:各モジュール(スクリプト)には*** _ name _ 属性があります。値が ' _ main _ *' **の場合、モジュール自体が実行されていること、つまりスクリプトとして実行されていることを示します。それ以外の場合は、インポートモジュールとして実行されています。スクリプトとして実行するか、インポートしたモジュールとして実行するかに関係なく、メインプログラムは実行されますが、名前が異なります。
dir()は組み込み関数(BIF)です。この関数は、インポートされたモジュールで定義されているすべての関数、属性、および変数の名前を見つけることができます。次に、文字列のリストとして返します。
>>> import sys
>>> dir(sys)['__displayhook__','__doc__','__excepthook__','__name__','__package__','__stderr__', '__stdin
__', '__ stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_mercurial', 'api_version
', ' argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displa
yhook', 'dllhandle', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'e
xec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval','getdefaultencoding','getfilesystemencoding','getprofile','getrecursionlimit','getrefcount','getsizeof','gettrace','getwindowsversion','hexversion','long_info','maxint','maxsize', '
maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', '
prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 's
ettrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions','winver']>>>
dir関数でパラメーターが渡されない場合、dir()関数は、現在のスクリプトで定義されているすべての関数、モジュール、変数、および属性の名前を一覧表示します。
>>> import sys
>>> def test():...print("test")...>>> a=123>>>dir()['__builtins__','__doc__','__name__','__package__','a','sys','test']>>>
Python自体には、いくつかの標準モジュールライブラリが付属しています。前述のように、特定の標準モジュールは、一般的に使用される別の記事で紹介されます(数が多すぎるため)。
一部のモジュールはパーサーに直接組み込まれています。これらは一部の言語の組み込み関数ではありませんが、非常に効率的に使用でき、システムレベルの呼び出しでも問題ありません。
これらのコンポーネントは、さまざまなオペレーティングシステムに応じてさまざまな形式で構成されます。たとえば、winregモジュールはWindowsシステムにのみ提供されます。
特別なモジュールsysがあることに注意してください。sysはSystemの略語であり、すべてのPythonパーサーに組み込まれています。変数sys.ps1およびsys.ps2は、プライマリプロンプトとセカンダリプロンプトに対応する文字列を定義します。
>>> import sys
>>> sys.ps1 #通訳のメインプロンプト
'>>> '>>> sys.ps2 #インタープリターのサブプロンプト(このサブプロンプトは、関数を作成するときに表示されます)
'... '>>> sys.ps1 ='C> ' #インタプリタのメインプロンプトを次のように変更します'C> '
C>print('Yuck!')
Yuck!
C>
パッケージは、フォルダと同様にPythonモジュールの名前を管理する形式であり、このフォルダの下には多くのサブファイルがあり、これらのサブファイルは個別のモジュールです。パッケージ内のモジュールを使用する必要がある場合は、他のプログラミング言語と同様にアクセサーとして使用する必要があります。
たとえば、モジュールの名前がABの場合、パッケージAのサブモジュールBを表します。
モジュールを使用する場合と同様に、異なるモジュール間のグローバル変数の相互影響について心配する必要はありません。また、ドットモジュール名の形式を採用することで、異なるライブラリ間で同じモジュール名を心配する必要もありません。
このようにして、さまざまな作成者がNumPyモジュールまたはPythonグラフィックライブラリを提供できます。
サウンドファイルとデータを均一に処理するモジュールのセット(または「パッケージ」と呼ぶ)を設計するとします。
さまざまなオーディオファイル形式があります(基本的にサフィックス名で区別されます。例:.wav、:file:.aiff、:file:.au、)。そのため、次のモジュールを常に増やしていく必要があります。異なるフォーマット間で変換します。
また、これらのオーディオデータには、さまざまな操作(ミキシング、エコーの追加、イコライザー機能の追加、人工ステレオエフェクトの作成など)があるため、これらの操作を処理するために書き込むことができないモジュールのセットも必要です。
可能なパッケージ構造は次のとおりです(階層ファイルシステム)。
1. sound/トップレベルパッケージ
2. __ init__.pyはサウンドパッケージを初期化します
3. formats/ファイル形式変換サブパッケージ
4. __ init__.py
5. wavread.py
6. wavwrite.py
7. aiffread.py
8. aiffwrite.py
9. auread.py
10. auwrite.py
11....12. effects/サウンドエフェクトサブパッケージ
13. __ init__.py
14. echo.py
15. surround.py
16. reverse.py
17....18. filters/フィルタサブパッケージ
19. __ init__.py
20. equalizer.py
21. vocoder.py
22. karaoke.py
23....
パッケージをインポートするとき、Pythonはsys.pathのディレクトリに従って、パッケージに含まれているサブディレクトリを探します。
ディレクトリは、** init 。pyというファイルが含まれている場合にのみパッケージと見なされます。これは主に、一部の下品な名前(文字列など)が検索パスの有効なモジュールに誤って影響を与えるのを防ぐためです。
最も単純なケースでは、空の* _ init _ 。py ファイルを配置するだけです。もちろん、このファイルには、初期化コードを含めたり、 _ all _ ***変数に値を割り当てたりすることもできます(後で紹介します)。
ユーザーは、一度に1つのパッケージで特定のモジュールのみをインポートできます。例:
import sound.effects.echo #サウンドはトップレベルのパッケージ、エフェクトはサブパッケージ、エコーはサブパッケージの下のモジュールです
上記のコードは、** sound.effects.echo **という形式のサブモジュールをインポートします。モジュール内の関数または属性にアクセスするには、フルネームを使用する必要があります。
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
サブモジュールをインポートする別の方法があります。
from sound.effects import echo
上記のコードは、echoという形式のサブモジュールをインポートしますが、これらの長いプレフィックスは必要ないため、次のようにモジュール内の関数または属性にアクセスできます。
echo.echofilter(input, output, delay=0.7, atten=4)
別の方法は、特定の関数または変数を直接インポートすることです。
from sound.effects.echo import echofilter
同様に、このメソッドはサブモジュールechoをインポートし、echofilter()関数を直接使用できます。
echofilter(input, output, delay=0.7, atten=4)
パッケージインポートアイテムからのフォームを使用する場合、対応するアイテムは、パッケージ内のサブモジュール(サブパッケージ)、または関数、クラス、変数など、パッケージで定義されている他の名前のいずれかであることに注意してください。
インポート構文は、最初にアイテムをパッケージ定義の名前として扱い、見つからない場合は、モジュールに従ってインポートを試みます。まだ見つけていない場合は、おめでとうございます:ImportErrorがスローされました。
逆に、import item.subitem.subsubitemなどのインポートフォームを使用する場合、最後のアイテムを除くすべてがパッケージである必要があり、最後のアイテムはモジュールまたはパッケージにすることができますが、クラス、関数、または変数の名前にすることはできません。 。
想像してみてください。fromsound.effectsimportを使用するとどうなりますか?
Pythonはファイルシステムに入り、このパッケージ内のすべてのサブモジュールを見つけて、それらを1つずつインポートします。
残念ながら、Windowsは大文字と小文字を区別しないシステムであるため、この方法はWindowsプラットフォームではうまく機能しません。
このタイプのプラットフォームでは、ECHO.pyというファイルがモジュールecho、Echo、さらにはECHOとしてインポートされるかどうかを保証することはできません。
(たとえば、Windows 95は各ファイルの最初の文字を大文字にするのが面倒です)そしてDOSの8 + 3命名規則は長いモジュール名を処理するため、問題はさらに複雑になります。
この問題を解決するために、私はパッケージの作成者に正確なパッケージインデックスを提供することしかできません。
importステートメントは次のルールに従います。パッケージ定義ファイル** _ init _ 。py に _ all _ *というリスト変数がある場合、from package import を使用すると、このリスト内のすべての名前パッケージコンテンツとしてインポートします。
パッケージの作成者は、パッケージの更新後に _ all _ **も更新されることを忘れないでください。あなたは私がこれをしないと言いました、私はインポートを使用しません、大丈夫、問題ありません、あなたを上司にします。次に例を示します。sounds/ effects / *** _ init _ *。py **には次のコードが含まれています。
__ all__ =["echo","surround","reverse"]
これは、from sound.effects import *を使用する場合、これら3つのサブモジュールのみをパッケージにインポートすることを意味します。
*** _ all _ *が実際に定義されていない場合、sound.effects import の構文を使用すると、sound.effectsパッケージ内のサブモジュールはインポートされません。彼はパッケージsound.effectsとそれに定義されているすべてのコンテンツをインポートしました(おそらく _ init _ 。py で定義されている初期化コードを実行します)。
これにより、 _ init _ *。py **で定義されているすべての名前がインポートされます。そして彼は、この文の前にインポートした明示的に指定されたすべてのモジュールを破棄するわけではありません。コードのこの部分を見てください。
import sound.effects.echo
import sound.effects.surround
from sound.effects import*
この例では、from ... importを実行する前に、sound.effectsパッケージのechoモジュールとsurroundモジュールが現在の名前名にインポートされています。 (もちろん、*** _ all _ ***が定義されていれば、問題ありません)
*この方法を使用してモジュールをインポートすることは、通常、推奨しません。これは、この方法ではコードの読みやすさが低下することが多いためです。ただし、これによりキーを押す手間が大幅に節約され、一部のモジュールは特定の方法でのみインポートされるように設計されています。
パッケージインポートspecific_submoduleからの使用に間違いがないことを忘れないでください。実際、これも推奨される方法です。インポートするサブモジュールが他のパッケージのサブモジュールと同じ名前である場合を除きます。
パッケージが構造内のサブパッケージ(この例のパッケージサウンドなど)であり、兄弟パッケージ(同じレベルのパッケージ)をインポートする場合は、インポート絶対パスを使用してインポートする必要があります。たとえば、モジュールsound.filters.vocoderがパッケージsound.effectsのモジュールechoを使用する場合は、sound.effects importechoから書き込む必要があります。
from.import echo
from..import formats
from..filters import equalizer
暗黙的および明示的な相対インポートは、現在のモジュールから開始されます。メインモジュールの名前は常に** "* _ main _ " です。Pythonアプリケーションのメインモジュールは、常に絶対パスで参照する必要があります。
このパッケージには、追加の属性 _ path _ も含まれています。これはディレクトリのリストです。含まれている各ディレクトリには、このパッケージの _ init _ 。py があります。他の _ init _ *。py **を実行する前に定義する必要があります。この変数は、パッケージに含まれるモジュールとサブパッケージに影響を与えるように変更できます。
この関数は一般的には使用されず、通常、パッケージ内のモジュールを拡張するために使用されます。
Recommended Posts