バリケンのPython日記 RSSフィード

2008-08-13

[] パッケージ(1)  パッケージ(1) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  パッケージ(1) - バリケンのPython日記  パッケージ(1) - バリケンのPython日記 のブックマークコメント

Pythonにはモジュール名を階層化するしくみがあるよ。このモジュールの階層化のことを「パッケージ」と呼ぶみたい。

パッケージの階層化は、ディレクトリ(フォルダ)によって実現するよ。注意が必要なのが、あるフォルダを「パッケージが入ったディレクトリ」としてPythonに認識させるには、そのフォルダに「__init__.py」というファイルを置く必要があることだよ。

「__init__.py」にはパッケージの初期化コードを書くんだけど、通常は空のファイルで大丈夫みたいだよ。

パッケージの例として、たとえばGoogle App Enginenには、Googleのユーザー認証機能を利用できる「google.appengine.api.users」というモジュールがあるんだけど、モジュールの名前を見ると分かるけど、ドットで区切られた階層構造になっているよね。この「階層化のためのフォルダ」のことをパッケージと呼ぶみたいだよ。

google.appengine.api.users」モジュールはどのように配置されているかと言うと、

  1. ライブラリ検索パス中のどこかにあるgoogleフォルダ
  2. そのgoogleフォルダの中のappengineフォルダ
  3. そのappengineフォルダの中のapiフォルダ
  4. そのapiフォルダの中のusers.py

という感じで配置されていて、上記1.~3.のフォルダの中には、それぞれ「__init__.py」が配置されているよ。つまりパッケージとは「__init__.pyの置かれたフォルダ」のことと考えればいいみたい。

google.appengine.api.users」モジュールは、たとえば

from google.appengine.api import users

user = users.get_current_user()

のような感じで使うことが出来るよ。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080813

2008-08-12

[] モジュールのバイトコンパイル  モジュールのバイトコンパイル - バリケンのPython日記 を含むブックマーク はてなブックマーク -  モジュールのバイトコンパイル - バリケンのPython日記  モジュールのバイトコンパイル - バリケンのPython日記 のブックマークコメント

Pythonでは、「import モジュール名」としてそのモジュールファイルを読み込んだ瞬間、必要であればPythonインタプリタが自動的にバイトコンパイルファイルを生成または更新するよ。バイトコンパイルファイルは「モジュール名.py」に対して「モジュール名.pyc」というファイル名になるよ。

そして、次回から「import モジュール名」でモジュールを読み込むとき、「モジュール名.py」と同じディレクトリに「モジュール名.pyc」というファイルがあれば、そちらを読み込むよ。

通常は意識してバイトコンパイルをする必要はないよ。「モジュール名.py」のほうがタイムスタンプが新しければ、「モジュール名.py」を自動的に再コンパイルして更新してくれるよ。

Python インタプリタを「-O」オプションをつけて起動すると、バイトコンパイルが「最適化」され、「モジュール名.pyo」というファイルを生成するよ。「-O」よりももっと最適化する「-OO」というオプションもあるみたいだよ。

ちなみに、最適化やコンパイルによって速くなるのはモジュールの読み込み速度だけみたい。「スクリプトが動き出すまでの時間」は短くなるけど、「スクリプトが動き出してからの実行速度」は変わらないよ。

ライブラリの配布の際は、「モジュール名.pyc」(または「モジュール名.pyo」)だけを配布してもきちんと動作するみたい。ソースコードを非公開にしてライブラリを配布したいときは、バイトコンパイルしたファイルを配布するといいんじゃないかな。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080812

2008-08-11

[] dir()関数  dir()関数 - バリケンのPython日記 を含むブックマーク はてなブックマーク -  dir()関数 - バリケンのPython日記  dir()関数 - バリケンのPython日記 のブックマークコメント

組込み関数dir()を使うと、あるモジュールで定義されている名前を調べることができるよ。

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__',
'__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version',
'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info',
'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix',
'executable', 'exit', 'getcheckinterval', 'getdefaultencoding',
'getfilesystemencoding', 'getrecursionlimit', 'getrefcount',
'getwindowsversion', 'hexversion', 'maxint', 'maxunicode', 'meta_path',
'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform',
'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit',
'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version',
'version_info', 'warnoptions', 'winver']
>>>

引数なしでdir()関数を呼び出すと、現在定義されている名前を列挙するよ。

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

dir(__builtins__)とすると、組込みの関数変数の名前を列挙するよ。

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError',
'Exception', 'False', 'FloatingPointError', 'FutureWarning',
'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning',
'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',
'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True',
'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
'WindowsError', 'ZeroDivisionError', '_', '__debug__', '__doc__',
'__import__', '__name__', 'abs', 'all', 'any', 'apply', 'basestring',
'bool', 'buffer', 'callable', 'chr', 'classmethod', 'cmp', 'coerce',
'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict',
'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file',
'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance',
'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long',
'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property',
'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed',
'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str',
'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange',
'zip']
>>>
トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080811

2008-08-10

[] モジュール(4)  モジュール(4) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  モジュール(4) - バリケンのPython日記  モジュール(4) - バリケンのPython日記 のブックマークコメント

標準モジュール

Pythonには「標準モジュール」がライブラリとして付属しているよ。「標準モジュール」は、Pythonデフォルトモジュール検索パスのどこかにあるか、もしくはインタプリタに組み込みのモジュールだよ。

Pythonデフォルトモジュール検索パスは、「import sys」したあとに「sys.path」で調べることが出来るよ。

>>> import sys
>>> sys.path
['', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\
\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25
', 'C:\\Python25\\lib\\site-packages']
>>>

ちなみに、sysモジュールインタプリタ組み込みのモジュールだよ。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080810

2008-08-09

[] モジュール(3)  モジュール(3) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  モジュール(3) - バリケンのPython日記  モジュール(3) - バリケンのPython日記 のブックマークコメント

モジュールには、通常は関数定義などを書くよ。

モジュールに実行文を書くこともできるけど、モジュールは最初にimportされた時にだけ実行されるから、何度も呼び出したい実行文をモジュールに書いて何度もimportしても、最初のimportのときにしか実行されないから注意してね。

C:\Python25>notepad hello.py

C:\Python25>type hello.py
print "Hello, world!"
C:\Python25>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
Hello, world!
>>> import hello
>>> import hello
>>>

実行文を何度も呼び出したいなら、関数定義して関数を呼び出すようにするのがいいと思うよ。

C:\Python25>notepad hello.py

C:\Python25>type hello.py
def hello():
  print "Hello, world!"
C:\Python25>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from hello import *
>>> hello()
Hello, world!
>>> hello()
Hello, world!
>>> hello()
Hello, world!
>>>
トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080809