本日は`モジュール`と`入力と出力`を勉強しました。
ここでは勉強会中に余り話されなかった暗黙のimportの話 と pickleの話をメモしておきます。
暗黙のimportの話
詳しくは知らないですが、暗黙のimportはpython3からできなくなるようです。
いまいち実感がわかないのでサンプルを作ってみます。
ファイルとディレクトリの構成
[bash]
-app
|- sample.py
|- mymodule
|- __init__.py <-これは中身は空でOK
|- sample1.py
|- sample2.py
[/bash]
sample.py
[python]
from mymodule import sample1
sample1.func1()
[/python]
mymodule/sample1.py
[python]
from __future__ import print_function
import sample2
def func1():
print(‘func1’)
sample2.func2()
[/python]
mymodule/sample2.py
[python]
from __future__ import print_function
def func2():
print(‘func2’)
[/python]
これをpython2.7.3 と python3.2.3で実行してみる。
[bash]
% python sample.py
func2
func1
% python3 sample.py
Traceback (most recent call last):
File "sample.py", line 2, in <module>
from mymodule import sample1
File "/Users/planset/Dropbox/private/mydoc/study/python_asahikawa_20120918/mymodule/sample1.py", line 2, in <module>
import sample2
ImportError: No module named sample2
[/bash]
python 2.7.3だとsample2を import sample2 でimportできるのに対し、python3ではImportErrorとなる。
これを正常に読み込めるようにするには、sample1.pyを変更する必要がある。
[python]
from __future__ import print_function
from . import sample2
def func1():
print(‘func1’)
sample2.func2()
[/python]
これでpython2.7.3でもpython3.2.3でもImportErrorがでない。
[bash]
% python sample.py
func2
func1
% python3 sample.py
func2
func1
[/bash]
pickleの話
オブジェクトを簡単に保存/復元できるようなモジュールです。
たとえばこんなサンプル。これでUserクラスをさくっと保存して、読み込み直しています。
[python]
from __future__ import print_function
import pickle
filepath = ‘pickle.dat’
class User(object):
name = ”
def __new__(cls, *args, **kwargs):
print(‘__new__’)
o = object.__new__(cls)
return o
def __init__(self, name):
self.name = name
print(‘__init__’)
def savedata():
print(‘new user’)
user = User(‘Daisuke Igarashi’)
with open(filepath, ‘wb’) as f:
pickle.dump(user, f)
print(‘saved user’)
def loaddata():
print(‘load from file’)
with open(filepath, ‘rb’) as f:
user = pickle.load(f)
print(user.name)
print(‘loaded user’)
savedata()
print(”)
loaddata()
[/python]
python2
[bash]
% python sample_pickle.py
new user
__new__
__init__
saved user
load from file
Daisuke Igarashi
loaded user
[/bash]
すごく簡単にデータの保存と復元ができます。
ちなみに、python3で実行すると
[bash]
% python3 sample_pickle.py
new user
__new__
__init__
saved user
load from file
__new__
Daisuke Igarashi
loaded user
[/bash]
あれ!?
__new__が実行されてる!
と、挙動が変わっています。クラスの挙動が変わったのかな? pickleの挙動ではない気がするがどうなんだろう。
PyConJPライトニングトークでのpickleの話
先日のPyConJPのライトニングトークの38:00くらいからPickle For Serializationという話がありますので見てみるといいかもです。
(私には何を言ってるのかわかりませんけど!)
larry / mille / overview — Bitbucket