본문 바로가기

python tutorial -6 모듈

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 

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

 

>>> import fibo

 

심볼 테이블에 모듈 이름 fibo 만 저장.

모듈 이름을 통해 함수 액세스

 

この操作ではfibo 定義された関数名前直接現在のシンボルテーブルに入力することはありません

にモジュールfibo だけをシンボルテーブルにれます関数にはモジュール使ってアクセスします:

 

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

 



변수에 모듈의 함수 대입가능

関数使うのならローカルな名前代入できます:

 

>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

 



6.1. 모듈 더 보기 モジュールについてもうすこし 

 

모듈 초기화 문

모듈이 등장 때 실행


사실 함수 정의도 '실행' 되는 '문장' 입니다;

모듈 수준의 함수 정의를 실행하면 함수의 이름이 전역 심볼 테이블에 들어갑니다.

 

実行文はモジュールを初期化するためのものです

これらの実行文インポート最初に モジュールつかったときにだけ実行されます

 

実際には関数定義'実行' される '' です

モジュールレベルの関数定義実行すると関数名はモジュールのグローバルなシンボルテーブルにります

 



각 모듈은 심볼 테이블이 있음 

충돌 우려 없이 전역 변수 사용

 

々のモジュールは自分のプライベートなシンボルテーブルをっていてモジュールで定義されている関数はこのテーブルをグローバルなシンボルテーブルとして使います

したがってモジュールの作者ユーザのグローバル変数偶然的衝突こる心配をせずにグローバルな変数をモジュールで使ことができます

 


modname.itemname.

함수 참조법과 같이 모듈의 전역 변수를 참조


modname.itemname.

一方自分っている操作をきちんと理解していれば

モジュール関数参照するのと表記法,モジュールのグローバル変数をいじることもできます


 

모듈은 다른 모듈 임포트할 수 있음

Import 문 : 모듈 첫 줄 (절대x)

import 되는 모듈명 - 전역 심볼 테이블에 저장

 

モジュールがのモジュールを import することもできます

import てモジュールの(さらにえばスクリプトでも)先頭きますがこれは慣習であって必須ではありません

import されたモジュールimport っているモジュールのグローバルなシンボルテーブルにかれます

 

 

변종

 

모듈의 정의(메소드) import 

import にはあるモジュール名前import 実行しているモジュールのシンボルテーブル直接取むという変型があります

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

지역 심볼 테이블에 임포트되는 모듈의 이름 저장하지 않음. (fibo)

import 対象となるモジュールローカルなシンボルテーブルれることはありません

(ってではfibo 定義されません)

 

 

모듈의 모든 정의 import

モジュールで定義されている名前import するという変型もあります:

 

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

  

밑줄 (_) 로 시작하는 거를 제외 모든 정의를 임포트 함

대부분 사용안함 - 이미 정의한 것을 덮어버릴 수 있음.


このではアンダースコア (_) まるものをいてすべての名前をインポートします

どの場面Python プログラマーはこの使いません

未知名前がインタープリターにまれ定義済みの名前上書きしてしまう可能性があるからです

 

* 임포트 - not good

읽기 어려움

하지만, 대화형에서 입력 줄이는 것은 ok

 

一般的にはモジュールやパッケージから * import するというやりには賛同できません

というのはこの操作うとしばしば可読性しいコードになるからです

しかし対話セッションでキータイプのらすために使うのはわないでしょう

 

 

import '모듈명' as '대체명'

モジュールas いていた場合as ろの名前直接インポートされたモジュールが束縛します


>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

  

fibo 모듈을 fib 이름으로 사용



from


>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 



효율성의 이유로, 각 모듈은 인터프리터 세션마다 한 번만 import

    모듈 수정 시, 인터프리터를 재시작해야 함.

    또는, 대화형에서 모듈이 하나면 -  importlib.reload()

            import importlib;importlib.reload(modulename).


実行効率上理由モジュールはインタープリタの 1 セッションごとに 1 だけ import されます

ってモジュールを修正した場合にはインタープリタを再起動せなければなりません 

もしくはその手直ししてテストしたい モジュールが 1 つだった場合にはimportlib.reload() 使ってください

         import importlib; importlib.reload(modulename)





6.1.1. 모듈을 스크립트로 실행하기 モジュールをスクリプトとして実行


python fibo.py <arguments>

= import


 __name__ 은 "__main__" 로 설정 됨

 __name__に __main__ 設定されているいて import したときとじようにモジュールのコードが実行されます

 

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

     


파일 -> 스크립트로 사용을 의미


このコードを追加することでこのファイルが import できるモジュールであると同時にスクリプトとしても使えるようになります

なぜならモジュールが "main" ファイルとして起動されたときだけコマンドラインを解釈するコードが実行されるからです:

 

$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34

 



 

모듈이 임포트될 때 실행 하지 않음

モジュールが import された場合そのコードは実行されません:

 

>>> import fibo
>>>

 

이는 모듈에 대한 편리한 인터페이스를 제공 / 테스트 목적으로 사용

(모듈을 스크립트로 실행하면 테스트 스위트를 실행하기).

 

この方法はモジュールに便利なユーザインターフェースを提供したりテストのために

(スクリプトをモジュールとして起動しテストスイートを実行して) 使われます

 

 


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 という変数一次プロンプトと二次プロンプトに表示する文字列定義しています:

 

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

 

이 두 변수는 인터프리터가 대화형 모드 때만 정의

これらのつの変数インタプリタが対話モードにあるときだけ定義されています

 

변수 sys.path

인터프리터의 모듈 검색 경로를 결정하는 문자열들의 리스트

환경 변수 PYTHONPATH 에서 취한 기본 경로

PYTHONPATH가 설정되지 않는 경우 기본 값으로 초기화

 

変数 sys.path

文字列からなるリストでインタプリタがモジュールを検索するときのパスを決定します

sys.path 環境変数 PYTHONPATH からたデフォルトパスに

PYTHONPATH 設定されていなければみのデフォルト設定されます

 



리스트 연산 append 사용 수정 가능

標準的なリスト操作変更することができます:

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')

 

 



6.3. dir() 함수 dir() 関数

 

dir()

모듈안 정의들의 이름 검색 - 출력

반환 값 : 문자열 리스트

모든 형의 이름을 나열 변수모듈함수등등


 

組込関数 dir()

あるモジュールがどんな名前定義しているか調べるために使われます

dir() はソートされた字列のリストします

変数モジュール関数そのすべての種類名前をリストすることに注意してください

 

>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
 '__package__', '__stderr__', '__stdin__', '__stdout__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
 '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
 'call_tracing', 'callstats', 'copyright', 'displayhook',
 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
 'thread_info', 'version', 'version_info', 'warnoptions']

 

 

 

인자가 없으면, dir() 는 현재 정의한 이름을 나열

引数がなければdir() 現在定義している名前列挙します:


>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']

 


 

내장 함수와 변수들의 이름은 나열하지 않음

원한다면, 표준 모듈 builtins 에 정의


dir()組込みの関数変数名前はリストしません

これらの名前からなるリストが必要なら標準モジュール builtins 定義されています:

 

>>> import builtins
>>> dir(builtins)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']

 


 


6.4. 패키지 パッケージ

 

패키지

'점'으로 '구분'된 모듈 이름

모듈을 구조화

 

パッケージ (package)

    Python のモジュール名前空間"ドットきモジュール" 使って構造化する手段です

 


ex)

A.B

: A 패키지에 있는 B 모듈

모듈 이름 중복 걱정을 필요없게 함.


えばモジュールA.B

A というパッケージのサブモジュール B します

ちょうどモジュールを利用すると々のモジュールの著者いのグローバル変数名について心配しなくてもむようになるのとじようにドットきモジュール利用するとNumPy Pillow のように複数モジュールからなるパッケージの著者いのモジュールについて心配しなくてもむようになります

 

if)

음향 파일과 데이터의 일관된 처리를 위한 모듈들의 컬렉션 ("패키지") 설계 시

여러 음향 파일 형식 간 변환을 위해 모듈 컬렉션 생성/ 유지 필요 (확장자 : .wav, .aiff, .au)

 음향 데이터에 적용하고자 하는 많은 연산 모듈 작성 (믹싱, 에코, 이퀄라이저 기능)


音声ファイルや音声データを一様うためのモジュールのコレクション ("パッケージ") 設計したいと仮定しましょう

音声ファイルにはくのなった形式がある (通常拡張子えば .wav, .aiff, .au などで認識されます) のでける々なファイル形式相互変換するモジュールを作成したりメンテナンスしたりする必要があるかもしれません 

また音声データにして実行したい々な独自操作 (ミキシングエコーの追加イコライザ関数適用人工的なステレオ効果作成など) があるかもしれません

 


패키지 - 구성 (계층적 파일 시스템):

(階層的なファイルシステムで表現した)

 

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...




패키지 임포트

   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 をロードします

このモジュールは以下のように完全名前参照しなければなりません

import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

 

=

from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

      echo 로드하고패키지 접두어 없이 사용 가능


これもサブモジュール echo をロードし、 echo をパッケージ接頭辞なしで利用できるようにします

って以下のようにいることができます:



함수, 변수 직접 임포트

さらにもうつのバリエーションとして必要関数変数直接 import する方法があります:

from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

     함수 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 

 

__all__ = ["echo", "surround", "reverse"]

 

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 明示的にロードされたものもみます

 

 

import sound.effects.echo
import sound.effects.surround
from sound.effects 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 使うことができます

 

また明示的相対importfrom module import name 形式import 利用できます

この明示的相対 import では先頭のドットで現在およびパッケージを指定します

 

ex)

surround 모듈

surround モジュールの

from . import echo
from .. import formats
from ..filters import equalizer

 

상대 임포트가 현재 모듈의 이름에 기반을 둔다는 것에 주의

相対 import 現在のモジュールをベースにすることに注意してください



메인 모듈의 이름은 항상 "__main__" 기 때문에파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 합니다.

メインモジュールの名前に "__main__" なのでPython アプリケーションのメインモジュールとして利用されることを意図しているモジュールでは絶対 import 利用するべきです

 

 



6.4.3. 여러 디렉토리에 있는 패키지 複数ディレクトリのパッケージ

 

__path__

    __init__.py 파일을 실행하기 전, 이 파일의 위치를 리스트로 초기화

    이 변수는 수정 가능. 이후로 패키지에 포함된 모듈과 서브 패키지를 검색하는 데 영향을 끼침

 

パッケージはもう特別属性として __path__ をサポートしています

この属性パッケージの __init__.py のコードが実行されるよりも__init__.py められているディレクトリったリストになるよう初期化されますこの変数変更することができます変更えると以降そのパッケージにっているモジュールやサブパッケージの検索影響します

 

 

이 기능이 자주 필요하지는 않지만, 패키지에서 발견되는 모듈의 집합을 확장하는 데 사용

この機能はほとんど必要にはならないのですがパッケージ内存在するモジュール拡張するために使うことができます