python tutorial part 6
모듈 モジュール (module)
https://docs.python.org/ko/3/tutorial/modules.html
대화형 인터프리터는 저장이 안 됨. -> ‘파일’로 저장 / 실행
Python インタプリタを終了させ、再び起動すると、これまでに行ってきた定義 (関数や変数) は失われています。
ですから、より長いプログラムを書きたいなら、テキストエディタを使ってインタプリタへの入力を用意しておき、
手作業の代わりにファイルを入力に使って動作させるとよいでしょう。
-> '스크립트를 만든다‘ 라고 함.
この作業を スクリプト (script) の作成と言います。
파일 = '모듈 '
- 긴 프로그램의 유지보수 위해
- 다른 함수를 복사하지 않고 사용
プログラムが長くなるにつれ、メンテナンスを楽にするために、スクリプトをいくつかのファイルに分割したくなるかもしれません。
また、いくつかのプログラムで書いてきた便利な関数について、その定義をコピーすることなく個々のプログラムで使いたいと思うかもしれません。
こういった要求をサポートするために、Python では定義をファイルに書いておき、スクリプトの中やインタプリタの対話インスタンス上で使う方法があります。
このファイルを モジュール (module) と呼びます。
import를 통해 모듈을 불러옴
메인 모듈 : 최상위 수준 스크립트나 계산기 모드에서 액세스하는 변수들의 컬렉션
モジュールにある定義は、
他のモジュールや main モジュール (実行のトップレベルや電卓モードでアクセスできる変数の集まりを指します) に import (取り込み) することができます。
정의와 문장들을 담고 있는 파일. 확장자 .py
モジュールは Python の定義や文が入ったファイルです。
ファイル名はモジュール名に接尾語 .py がついたものになります。
모듈의 이름은 전역 변수__name__으로 제공
モジュールの中では、(文字列の) モジュール名をグローバル変数 __name__ で取得できます。
fibo.py
심볼 테이블에 모듈 이름 fibo 만 저장.
모듈 이름을 통해 함수 액세스
この操作では、fibo で定義された関数の名前を直接現在のシンボルテーブルに入力することはありません。
単にモジュール名 fibo だけをシンボルテーブルに入れます。関数にはモジュール名を使ってアクセスします:
변수에 모듈의 함수 대입가능
関数を度々使うのなら、ローカルな名前に代入できます:
6.1. 모듈 더 보기 モジュールについてもうすこし
모듈 초기화 문
모듈이 등장 때 실행
사실 함수 정의도 '실행' 되는 '문장' 입니다;
모듈 수준의 함수 정의를 실행하면 함수의 이름이 전역 심볼 테이블에 들어갑니다.
実行文はモジュールを初期化するためのものです。
これらの実行文は、インポート文の中で 最初に モジュール名が見つかったときにだけ実行されます。
実際には、関数定義も '実行' される '文' です。
モジュールレベルの関数定義を実行すると、関数名はモジュールのグローバルなシンボルテーブルに入ります。
각 모듈은 심볼 테이블이 있음
- 충돌 우려 없이 전역 변수 사용
各々のモジュールは、自分のプライベートなシンボルテーブルを持っていて、モジュールで定義されている関数はこのテーブルをグローバルなシンボルテーブルとして使います。
したがって、モジュールの作者は、ユーザのグローバル変数と偶然的な衝突が起こる心配をせずに、グローバルな変数をモジュールで使うことができます。
modname.itemname
.
함수 참조법과 같이 모듈의 전역 변수를 참조
modname.itemname
.
一方、自分が行っている操作をきちんと理解していれば、
モジュール内の関数を参照するのと同じ表記法で,モジュールのグローバル変数をいじることもできます。
모듈은 다른 모듈 임포트할 수 있음
Import 문 : 모듈 첫 줄 (절대x)
import 되는 모듈명 - 전역 심볼 테이블에 저장
モジュールが他のモジュールを import することもできます。
import 文は全てモジュールの(さらに言えばスクリプトでも)先頭に置きますが、これは慣習であって必須ではありません。
import されたモジュール名は import を行っているモジュールのグローバルなシンボルテーブルに置かれます。
변종
모듈의 정의(메소드) import
import 文には、あるモジュール内の名前を、import を実行しているモジュールのシンボルテーブル内に直接取り込むという変型があります。
지역 심볼 테이블에 임포트되는 모듈의 이름 저장하지 않음. (fibo)
import の対象となるモジュール名をローカルなシンボルテーブル内に取り入れることはありません 。
(従って上の例では、 fibo は定義されません)
모듈의 모든 정의 import
モジュールで定義されている名前を全て import するという変型もあります:
밑줄 (_) 로 시작하는 거를 제외 모든 정의를 임포트 함
대부분 사용안함 - 이미 정의한 것을 덮어버릴 수 있음.
この書き方ではアンダースコア (_) で始まるものを除いてすべての名前をインポートします。
殆どの場面で、Python プログラマーはこの書き方を使いません。
未知の名前がインタープリターに読み込まれ、定義済みの名前を上書きしてしまう可能性があるからです。
* 임포트 - not good
읽기 어려움
하지만, 대화형에서 입력 줄이는 것은 ok
一般的には、モジュールやパッケージから * を import するというやり方には賛同できません。
というのは、この操作を行うとしばしば可読性に乏しいコードになるからです。
しかし、対話セッションでキータイプの量を減らすために使うのは構わないでしょう。
import '모듈명' as '대체명'
モジュール名の後に as が続いていた場合は、 as の後ろの名前を直接、インポートされたモジュールが束縛します。
fibo 모듈을 fib 이름으로 사용
from
효율성의 이유로, 각 모듈은 인터프리터 세션마다 한 번만 import
모듈 수정 시, 인터프리터를 재시작해야 함.
또는, 대화형에서 모듈이 하나면 - importlib.reload()
import importlib;importlib.reload(modulename).
実行効率上の理由で、各モジュールはインタープリタの 1 セッションごとに 1 回だけ import されます。
従って、モジュールを修正した場合には、インタープリタを再起動させなければなりません
もしくは、その場で手直ししてテストしたい モジュールが 1 つだった場合にはimportlib.reload() を使ってください。
import importlib; importlib.reload(modulename)
6.1.1. 모듈을 스크립트로 실행하기 モジュールをスクリプトとして実行
= import
__name__
은 "__main__"
로 설정 됨
__name__に __main__ が設定されている点を除いて import したときと同じようにモジュール内のコードが実行されます。
파일 -> 스크립트로 사용을 의미
このコードを追加することで、このファイルが import できるモジュールであると同時にスクリプトとしても使えるようになります。
なぜならモジュールが "main" ファイルとして起動されたときだけ、コマンドラインを解釈するコードが実行されるからです:
모듈이 임포트될 때 실행 하지 않음
モジュールが import された場合は、そのコードは実行されません:
이는 모듈에 대한 편리한 인터페이스를 제공 / 테스트 목적으로 사용
(모듈을 스크립트로 실행하면 테스트 스위트를 실행하기).
この方法はモジュールに便利なユーザインターフェースを提供したり、テストのために
(スクリプトをモジュールとして起動しテストスイートを実行して) 使われます。
6.1.2. 모듈 검색 경로 モジュール検索パス
ex) spam 모듈이 임포트될 때,
인터프리터는 먼저
1) 내장 모듈 검색
2) 없으면 변수 sys.path 에 주어진 디렉토리에서 spam.py 파일검색
ex) spam という名前のモジュールをインポートするとき、
インタープリターはまずその名前のビルトインモジュールを探します。
見つからなかった場合は、 spam.py という名前のファイルを sys.path にあるディレクトリのリストから探します。
sys.path : 초기화 위치
sys.path は以下の場所に初期化されます:
- 입력 스크립트를 포함하는 디렉토리 (또는 파일이 지정되지 않았을 때는 현재 디렉토리).
- PYTHONPATH (디렉토리 이름들의 목록, 셸 변수 PATH 와 같은 문법).
- 설치 기본값
- 入力されたスクリプトのあるディレクトリ (あるいはファイルが指定されなかったときはカレントディレクトリ)。
- PYTHONPATH (ディレクトリ名のリスト。シェル変数の PATH と同じ構文)。
- インストールごとのデフォルト。
초기화 후, sys.path 수정 가능
初期化された後、 Python プログラムは sys.path を修正することができます。
스크립트가 있는 디렉토리 위치 : 검색 경로 처음 / 표준 라이브러리 앞
- 같은 이름일 경우 스크립트가 있는 디렉토리가 로드 됨
- 이 치환이 의도된 것이 아니면 에러
スクリプトファイルを含むディレクトリが検索パスの先頭、標準ライブラリパスよりも前に追加されます。
なので、ライブラリのディレクトリにあるファイルよりも、
そのディレクトリにある同じ名前のスクリプトが優先してインポートされます。
これは、標準ライブラリを意図して置き換えているのでない限りは間違いのもとです。
6.1.3. "컴파일된 파이썬 파일 "コンパイル" された Python ファイル
빠른 모듈 로딩을 위해
__pycache__ 디렉토리에 각 모듈 컴파일 버전을module.version.pyc
이름으로 캐싱
モジュールの読み込みを高速化するため、
Python はコンパイル済みの各モジュールを __pycache__ ディレクトリの module.version.pyc
ファイルとしてキャッシュします。
version :
컴파일된 파일의 형식 지정
파이썬의 버전 번호 포함
ここで version はコンパイルされたファイルのフォーマットを表すもので、一般的には Python のバージョン番号です。
ex
CPython 배포 3.3 에서 spam.py 컴파일 버전 : __pycache__/spam.cpython-33.pyc
- 배포와 버전 구분
例えば、CPython のリリース 3.3 の、コンパイル済みの spam.py は __pycache__/spam.cpython-33.pyc としてキャッシュされるでしょう。
この命名の慣習により、Python の異なる複数のリリースやバージョンのコンパイル済みモジュールが共存できます。
컴파일 필요 체크 : 자동으로 수정시간 - 컴파일 버전과 비교
Python はソースの変更日時をコンパイル済みのものと比較し、コンパイル済みのものが最新でなくなり再コンパイルが必要になっていないかを確認します。
컴파일된 모듈은 플랫폼에 독립적 : 같은 라이브러리를 서로 다른 아키텍처 시스템에서 공유 가능
これは完全に自動で処理されます。また、コンパイル済みモジュールはプラットフォーム非依存なため、アーキテクチャの異なるシステム間で同一のライブラリを共有することもできます。
캐시 검사 안하는 경우
1) 명령행에서 직접 로드되는 모듈들은 항상 재컴파일 / 결과는 저장 x
2) 소스 모듈이 없는 경우
배포를 지원하려면, 소스 디렉토리에 컴파일된 모듈은 있고, 소스 모듈은 없어야 함
Python は2つの場合にキャッシュのチェックを行いません。
ひとつは、コマンドラインから直接モジュールが読み込まれた場合で、常に再コンパイルされ、結果を保存することはありません。
2つめは、ソース・モジュールのない場合で、キャッシュの確認を行いません。ソースのない (コンパイル済みのもののみの) 配布をサポートするには、コンパイル済みモジュールはソース・ディレクトリになくてはならず、ソース・ディレクトリにソース・モジュールがあってはいけません。
tip
- 컴파일된 모듈의 크기를 줄이려면 파이썬 명령에 -O 나 -OO 스위치를 사용할 수 있음 -O 스위치는 assert 문을 제거하고, -OO 스위치는 assert 문과 __doc__ 문자열을 모두 제거합니다.어떤 프로그램들은 이것들에 의존하기 때문에, 무엇을 하고 있는지 아는 경우만 이 옵션을 사용해야 합니다."최적화된" 모듈은 opt- 태그를 갖고, 보통 더 작습니다. 미래의 배포에서는 최적화의 효과가 변경될 수 있습니다.
- .py 파일에서 읽을 때보다 .pyc파일에서 읽을 때 프로그램이 더 빨리 실행되지는 않습니다 .pyc 파일에서 더 빨라지는 것은 로드되는 속도뿐입니다.
- 모듈 compileall 은 디렉토리에 있는 모든 모듈의 .pyc 파일들을 만들 수 있습니다.
- 이 절차에 대한 더 자세한 정보, 결정들의 순서도를 포함합니다, 는 PEP 3147 에 나옵니다.
- コンパイル済みモジュールのサイズを小さくするために、Python コマンドに -O または -OO スイッチを使うことができます。-O スイッチは assert ステートメントを除去し、-OO スイッチは assert ステートメントと __doc__ 文字列を除去します。いくつかのプログラムはこれらの除去されるものに依存している可能性があるため、自分が何をしているかを理解しているときに限ってこれらのオプションを使うべきです。"最適化" されたモジュールは opt- タグを持ち、通常のコンパイル済みモジュールよりサイズが小さくなります。将来のリリースでは最適化の影響が変わる可能性があります。
- .pyc ファイルや.pyc ファイルから読み出されたとしても、プログラムは.py ファイルから読み出されたときより何ら高速に動作するわけではありません。.pyc ファイルで高速化されるのは、読み込みにかかる時間だけです。
- compileall モジュールを使ってディレクトリ内の全てのモジュールに対して.pyc ファイルを作ることができます。
- この処理に関する詳細は、判定のフローチャートを含めて、PEP 3147 に記載されています。
6.2. 표준 모듈들 標準モジュール
인터프리터 내장 모듈
이것들은 언어의 핵심적인 부분 x
내장 연산 효율 / 운영 체제 기본 요소 액세스 제공
幾つかのモジュールは言語のコアにはアクセスしないものの、効率や、システムコールなどOSの機能を利用するために、インタープリター内部にビルトインされています。
플랫폼 의존적
예) winreg 모듈 - 윈도우에서만 제공
そういったモジュールセットはまたプラットフォームに依存した構成オプションです。
例えば、 winreg モジュールは Windows システムでのみ提供されています。
주목
sys
모든 파이썬 인터프리터에 내장
sys モジュールは、全ての Python インタープリターにビルトインされています。
변수 sys.ps1 와 sys.ps2 는 기본과 보조 프롬프트로 사용되는 문자열을 정의
sys.ps1 と sys.ps2 という変数は一次プロンプトと二次プロンプトに表示する文字列を定義しています:
이 두 변수는 인터프리터가 대화형 모드 때만 정의
これらの二つの変数は、インタプリタが対話モードにあるときだけ定義されています。
변수 sys.path
인터프리터의 모듈 검색 경로를 결정하는 문자열들의 리스트
환경 변수 PYTHONPATH 에서 취한 기본 경로
PYTHONPATH가 설정되지 않는 경우 기본 값으로 초기화
変数 sys.path は
文字列からなるリストで、インタプリタがモジュールを検索するときのパスを決定します。
sys.path は環境変数 PYTHONPATH から得たデフォルトパスに、
PYTHONPATH が設定されていなければ組み込みのデフォルト値に設定されます。
리스트 연산 append 사용 수정 가능
標準的なリスト操作で変更することができます:
6.3. dir() 함수 dir() 関数
dir()
모듈안 정의들의 이름 검색 - 출력
반환 값 : 문자열 리스트
모든 형의 이름을 나열 : 변수, 모듈, 함수, 등등
組込み関数 dir() は、
あるモジュールがどんな名前を定義しているか調べるために使われます。
dir() はソートされた文字列のリストを返します
変数、モジュール、関数、その他の、すべての種類の名前をリストすることに注意してください。
인자가 없으면, dir() 는 현재 정의한 이름을 나열
引数がなければ、 dir() は現在定義している名前を列挙します:
내장 함수와 변수들의 이름은 나열하지 않음
원한다면, 표준 모듈 builtins 에 정의
dir()は、組込みの関数や変数の名前はリストしません。
これらの名前からなるリストが必要なら、標準モジュール builtins で定義されています:
6.4. 패키지 パッケージ
패키지
'점'으로 '구분'된 모듈 이름
모듈을 구조화
パッケージ (package) は、
Python のモジュール名前空間を "ドット付きモジュール名" を使って構造化する手段です。
ex)
A.B
: A 패키지에 있는 B 모듈
모듈 이름 중복 걱정을 필요없게 함.
例えば、モジュール名 A.B は、
A というパッケージのサブモジュール B を表します。
ちょうど、モジュールを利用すると、別々のモジュールの著者が互いのグローバル変数名について心配しなくても済むようになるのと同じように、ドット付きモジュール名を利用すると、 NumPy や Pillow のように複数モジュールからなるパッケージの著者が、互いのモジュール名について心配しなくても済むようになります。
if)
음향 파일과 데이터의 일관된 처리를 위한 모듈들의 컬렉션 ("패키지") 설계 시
여러 음향 파일 형식 간 변환을 위해 모듈 컬렉션 생성/ 유지 필요 (확장자 : .wav, .aiff, .au)
음향 데이터에 적용하고자 하는 많은 연산 모듈 작성 (믹싱, 에코, 이퀄라이저 기능)
音声ファイルや音声データを一様に扱うためのモジュールのコレクション ("パッケージ") を設計したいと仮定しましょう。
音声ファイルには多くの異なった形式がある (通常は拡張子、 例えば .wav, .aiff, .au などで認識されます) ので、増え続ける様々なファイル形式を相互変換するモジュールを、 作成したりメンテナンスしたりする必要があるかもしれません。
また、 音声データに対して実行したい様々な独自の操作 (ミキシング、 エコーの追加、 イコライザ関数の適用、 人工的なステレオ効果の作成など) があるかもしれません。
패키지 - 구성 (계층적 파일 시스템):
(階層的なファイルシステムで表現した)
패키지 임포트
sys.path에 있는 디렉토리를 검색하면서 패키지 서브 디렉토리를 검색
パッケージを import する際、
Pythonは sys.path 上のディレクトリを検索して、トップレベルのパッケージの入ったサブディレクトリを探します。
디렉토리 -> 패키지
__init__.py 파일이 필요
string 처럼 흔히 쓰는 이름의 디렉토리가, 의도하지 않게 맞는 모듈을 가리지 않도록
あるディレクトリを、パッケージが入ったディレクトリとしてPython に扱わせるには、ファイル __init__.py が必要です。
このファイルを置かなければならないのは、 string のようなよくある名前のディレクトリにより、モジュール検索パスの後の方で見つかる正しいモジュールが意図せず隠蔽されてしまうのを防ぐためです。
비어있는 __init__.py 파일
패키지 초기화 코드 실행
__all__변수를 설정
最も簡単なケースでは __init__.py はただの空ファイルで構いませんが、
__init__.py ではパッケージのための初期化コードを実行したり、後述の __all__ 変数を設定してもかまいません。
패키지로부터 개별 모듈 import
パッケージのユーザは、個々のモジュールをパッケージから import することができます。
ex)
서브 모듈 sound.effects.echo 로드 -전체 이름으로 참조되어야 함
この操作はサブモジュール sound.effects.echo をロードします。
このモジュールは、以下のように完全な名前で参照しなければなりません。
=
echo 로드하고, 패키지 접두어 없이 사용 가능
これもサブモジュール echo をロードし、 echo をパッケージ名を表す接頭辞なしで利用できるようにします。
従って以下のように用いることができます:
함수, 변수 직접 임포트
さらにもう一つのバリエーションとして、必要な関数や変数を直接 import する方法があります:
함수 echofilter() 직접 사용
この操作も同様にサブモジュール echo をロードしますが、 echofilter() を直接利用できるようにします:
from package import item
item : 패키지의 모듈, 패키지, 함수, 클래스, 변수 등 패키지의 정의
import
먼저 item이 있는지 검사하고 로드 시도
없으면 ImportError 예외
from package import item を使う場合、
item はパッケージ package のサブモジュール (またはサブパッケージ) でもかまいませんし、関数やクラス、変数のような、 package で定義されている別の名前でもかまわないことに注意してください。
import 文はまず、 item がパッケージ内で定義されているかどうか調べます。
定義されていなければ、 item はモジュール名であると仮定して、モジュールをロードしようと試みます。
もしモジュールが見つからなければ、 ImportError が送出されます。
import item.subitem.subsubitem
마지막 item을 제외 한 항목은 패키지여야 함
마지막 항목은 모듈, 패키지 / 클래스, 함수, 변수 x
反対に、 import item.subitem.subsubitem のような構文を使った場合、
最後の subsubitem を除く各要素はパッケージでなければなりません。
最後の要素はモジュールかパッケージにできますが、一つ前の要素で定義されているクラスや関数や変数にはできません。
6.4.1. 패키지에서 * 임포트 하기 パッケージから * を import する
from sound.effects import *
패키지에 있는 모든 정의를 import
- 시간이 오래 걸림
- 명시적으로 임포트할 경우에만 일어나야 하는 원치 않는 경우도 발생할 수도 있음.
それでは、ユーザが from sound.effects import * と書いたら、どうなるのでしょうか?
理想的には、何らかの方法でファイルシステムが調べられ、そのパッケージにどんなサブモジュールがあるかを調べ上げ、全てを import する、という処理を望むことでしょう。
これには長い時間がかかってしまうこともありますし、
あるサブモジュールを import することで、そのモジュールが明示的に import されたときのみ発生して欲しい副作用が起きてしまうかもしれません。
해결책 : 패키지의 색인 제공
__init__.py
코드 : __all__
제공 (이름 목록)
from package import * 를 만날 때 임포트 해야만 하는 모듈 이름들의 목록으로 받아들임
새 버전의 패키지 - 목록을 갱신하는 것은 패키지 저자의 책임
패키지에서 * 임포트를 지원 안 할 수 있음.
唯一の解決策は、パッケージの作者にパッケージの索引を明示的に提供させる というものです。
import 文の使う規約は、パッケージの __init__.py コードに __all__ という名前のリストが定義されていれば、 from package import * が現れたときに import すべきモジュール名のリストとして使う、というものです。 パッケージの新バージョンがリリースされるときにリストを最新の状態に更新するのは パッケージの作者の責任となります。 自分のパッケージから * を import するという使い方が考えられないならば、 パッケージの作者はこの使い方をサポートしないことにしてもかまいません。
ex)
sound/effects/__init__.py
from sound.effects import *
: 이 sound.effects 패키지의 세 서브 모듈들을 임포트하게 됨을 의미
__all__ 이 정의되지 않으면, 문장 from sound.effects import * 은
패키지 sound.effects 의 모든 서브 모듈을 임포트 하지 않습니다;
이것은 오직 패키지 sound.effects가 임포트 되도록 만들고 (__init__.py 에 있는 초기화 코드들이 수행될 수 있습니다),
그 패키지가 정의하는 이름들을 임포트 합니다.
이 이름들은 __init__.py 가 정의하는 모든 이름 (그리고 명시적으로 로드된 서브 모듈들)을 포함합니다.
이 이름들에는 사전에 import 문으로 명시적으로 로드된 패키지의 서브 모듈들 역시 포함됩니다.
この例では、 from sound.effects import * とすると、 sound パッケージから指定された 3つのサブモジュールが import されることになっている、ということを意味します。
もしも __all__ が定義されていなければ、実行文 from sound.effects import * は、パッケージ sound.effects の全てのサブモジュールを現在の名前空間の中へ import しません 。
この文は単に(場合によっては初期化コード __init__.py を実行して) パッケージ sound.effects が import されたということを確認し、そのパッケージで定義されている名前を全て import するだけです。 import される名前には、 __init__.py で定義された名前 (と、明示的にロードされたサブモジュール) が含まれます。パッケージのサブモジュールで、以前の import 文で明示的にロードされたものも含みます。
echo 와 surround 모듈이 임포트 되는데,
from...import 문이 실행될 때 sound.effects 패키지에 정의되기 때문입니다. (__all__ 이 정의될 때도 마찬가집니다.)
import * 사용 시, 특정 모듈만 import 하도록 설계되었다 하더라도 여전히 안좋은 코드임.
from package import specific_submodule
사용 - 잘못 없다는 것을 기억!
사실, 임포트하는 모듈이 다른 패키지에서 같은 이름의 서브 모듈을 사용할 필요가 없는 한 권장되는 표기법입니다.
上の例では、 echo と surround モジュールが現在の名前空間に import されます。これらのモジュールは from...import 文が実行された際に sound.effects 内で定義されているからです。 (この機構は __all__ が定義されているときにも働きます。)
特定のモジュールでは import * を使ったときに、特定のパターンに従った名前のみを公開 (export) するように設計されてはいますが、それでもやはり製品のコードでは良いことではないと考えます。
from package import specific_submodule を使っても何も問題はないことに留意してください!実際この表記法は、import を行うモジュールが他のパッケージと同じ名前を持つサブモジュールを使わなければならない場合を除いて推奨される方式です。
6.4.2. 패키지 내부 간의 참조 パッケージ内参照
패키지가 서브 패키지들로 구조화될 때 이웃 패키지의 서브 모듈을 가리키는데
절대 임포트 (예 sound 패키지처럼),
from sound.effects import echo
예를 들어, 패키지의 echo 모듈이 필요하면, from sound.effects import echo 사용
상대 임포트
from module import name
상대 임포트에 수반되는 현재와 부모 패키지를 가리키기 위해 앞에 붙는 점을 사용합니다.
パッケージが (前述の例の sound パッケージのように) サブパッケージの集まりに構造化されている場合、絶対 import を使って兄弟関係にあるパッケージを参照できます。例えば、モジュール sound.filters.vocoder で sound.effects パッケージの echo モジュールを使いたいとすると、 from sound.effects import echo を使うことができます。
また、明示的な相対importを from module import name の形式の import 文で利用できます。
この明示的な相対 import では、先頭のドットで現在および親パッケージを指定します。
ex)
surround 모듈
surround モジュールの
상대 임포트가 현재 모듈의 이름에 기반을 둔다는 것에 주의
相対 import は現在のモジュール名をベースにすることに注意してください。
메인 모듈의 이름은 항상 "__main__" 이기 때문에, 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 합니다.
メインモジュールの名前は常に "__main__" なので、Python アプリケーションのメインモジュールとして利用されることを意図しているモジュールでは絶対 import を利用するべきです。
6.4.3. 여러 디렉토리에 있는 패키지 複数ディレクトリ中のパッケージ
__path__
__init__.py 파일을 실행하기 전, 이 파일의 위치를 리스트로 초기화
이 변수는 수정 가능. 이후로 패키지에 포함된 모듈과 서브 패키지를 검색하는 데 영향을 끼침
パッケージはもう一つ特別な属性として __path__ をサポートしています。
この属性は、パッケージの __init__.py 中のコードが実行されるよりも前に、 __init__.py の収められているディレクトリ名の入ったリストになるよう初期化されます。この変数は変更することができます。変更を加えると、以降そのパッケージに入っているモジュールやサブパッケージの検索に影響します。
이 기능이 자주 필요하지는 않지만, 패키지에서 발견되는 모듈의 집합을 확장하는 데 사용
この機能はほとんど必要にはならないのですが、パッケージ内存在するモジュール群を拡張するために使うことができます。
'공부하기 > Python3 튜토리얼 정리' 카테고리의 다른 글
python tutorial -8 에러 / 예외 (0) | 2019.06.15 |
---|---|
python tutorial -7 입출력 (0) | 2019.06.15 |
python tutorial -5 자료 구조 (0) | 2019.06.14 |
python tutorial -4 제어 흐름 도구 (0) | 2019.06.13 |
python tutorial -3 주석, 수, 문자열, 리스트, end=, 조건/바디 .. (0) | 2019.06.11 |