第3回 Python勉強会@旭川に参加しました。

本日は`モジュール`と`入力と出力`を勉強しました。

第3回 Python勉強会@旭川 – connpass

ここでは勉強会中に余り話されなかった暗黙の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という話がありますので見てみるといいかもです。
(私には何を言ってるのかわかりませんけど!)

ライトニングトーク – YouTube

larry / mille / overview — Bitbucket