Pythonサポーターズ「パーフェクトPython」技術評論社


正誤表

ページ 位置 誤/正 備考
21 4行目 Guido van Rossam 氏は、 1 編集 削除
Guido van Rossum 氏は、 -
22 表1.1 ネットワークプログラミン 1 編集 削除
ネットワークプログラミング -
29 PEP 10 下から2行目 Guido van Rossam 氏が 1 編集 削除
Guido van Rossum 氏が -
39 2行目 com というディレクトリだけが見えあることでしょう 1 日本語の部分 編集 削除
com というディレクトリだけが見えることでしょう -
40 下から3行目 祖結合の 1 編集 削除
疎結合の -
43 1行目 少数部を持つ値を 1 編集 削除
小数部を持つ値を -
45 1-4-14 2行目 Guido van Rossam は 1 編集 削除
Guido van Rossum 氏は -
46 1.5 Python を使う準備 1-5-1 メジャープロットフォームへのインストール 1 編集 削除
1-5-1 メジャープラットフォームへのインストール -
46 1-5-1 Widnows 1 編集 削除
Windows -
47 オートコンプリートの実行サンプル object oct oepn ord 1 openのタイポ 編集 削除
object oct open ord -
49 シェルコマンドの実行 捜査中 1 編集 削除
操作中 -
51 1 PHPなどと共にに 1 編集 削除
PHPなどと共に -
65 3-3-1 2行目 かなり大きいな値が 1 編集 削除
かなり大きな値が -
68 2番目の実行例 # 少数点を含む実数 1 編集 削除
# 小数点を含む実数 -
70 中央のサンプルコード >>> math.py 3 ミスタイプが残っている 編集 削除
(消去) -
71 表3.3 rect(x) 1 編集 削除
rect(r, phi) -
72 最初の実行例の下 実装として扱えない 1 編集 削除
実数として扱えない -
75 最初のコードサンプル coding[:=]s*([-w.]+) 1 編集 削除
coding[:=]\s*([-\w.]+) -
76 サンプルコード下 複合化しようとすると、 1 「復号しようとすると」でも良い 編集 削除
復号化しようとすると、 -
81 スライスサンプル >>> x[2:-1] [3.0, 'a', 'b', 'c'] 2 編集 削除
>>> x[2:-1] [3.0, 'a', 'b'] -
87 3-5-1 セットの操作 discartdメソッドを使えば 1 編集 削除
discardメソッドを使えば -
90 3番目の実行例の下6行目 シンメトリックディッファレンス 1 編集 削除
シンメトリックディファレンス -
91 1つ目のサンプルコードの下、5行目 disjointメソッドを 1 編集 削除
isdisjointメソッドを -
97 4-1 条件文 空のシーケンス([]や()や[]) 1 編集 削除
空のシーケンス(""や()や[]) -
97 4-1 条件文 __nonezero__ メソッドが 1 編集 削除
__bool__ メソッドが -
98 4,5行目 条件分 1 編集 削除
条件文 -
101 4.2 比較演算子 >>> 0 < 1 < 2 < 3 True 1 このサンプルコードはあまりにひどいと思う... 編集 削除
>>> x = 2 >>> 0 < x < 3 True >>> x = 4 >>> 0 < x < 3 False -
102 4-2-1等価  文字列も度同様に同じ文字列 1 編集 削除
文字列も同様に同じ文字列 -
109 4-5 (2箇所) 替わりに 1 編集 削除
代わりに -
110 4-6 4行目 try のブロックに既述し、 1 編集 削除
try のブロックに記述し、 -
121 5-2 二つ目のサンプルコード kwargs = {'arg3': 3, 'arg4': 4} 1 編集 削除
kwargs = {'arg4': 4, 'arg5': 5} -
122 2行目 関数append_number()の戻り値を見ると、 1 編集 削除
上の例で、関数append_number()の戻り値は、 -
123 サンプルコード内 def spam(*args, defaultarg="省略時の値"): ... 1 編集 削除
def spam(*args, default_arg="省略時の値"): ... -
126 1行目 この例のように 1 編集 削除
リスト5.4のように -
129 5-8-4 サンプルコード内 >>> for value in generator: 1 ()がないと TypeError: 'function' object is not iterable が発生します。 編集 削除
>>> for value in generator(): -
131 サンプルコード内 def pick_odd(seq): return filter(lambda item: item % 2 == 0, seq) 1 編集 削除
def pick_odd(seq): return filter(lambda item: item % 2 == 1, seq) -
131 先頭のサンプル item %2 == 1 1 編集 削除
item % 2 == 1 -
137 1行目 新しいインスタンスが帰ってきます 1 編集 削除
新しいインスタンスが返ってきます -
140 サンプルコード内 # Base.spam() をオーバーロード 1 編集 削除
# Base.spam() をオーバーライド -
146 6-9-3:二つ目の小タイトルと表6.2のタイトル 演算子に対応するメソッド 1 編集 削除
演算子の左項に対応するメソッド -
147 表6.4 見出し行 累積代入分 1 編集 削除
累積代入文 -
153 サンプルコード内 delete spam.ham 1 編集 削除
del spam.ham -
153 サンプルコード2つ目のブロック self.__ham == value 1 編集 削除
self.__ham = value -
154 6-14-1 サンプルコード内 class Spam:: 1 編集 削除
class Spam: -
158 3-4行目 isinstance(Spam, Food)やisinstance(Ham()), Food)の結果は 1 編集 削除
isinstance(Spam(), Food)やisinstance(Ham(), Food)の結果は -
158 2行目 Spam`` と 1 編集 削除
Spam と -
158 5行目 abstructmethod()デコレータ 1 編集 削除
abstructmethodデコレータ -
161 1行目 メンバのみが 1 編集 削除
全てのメンバが -
161 最後の行 ディレクトリ名を「:」を区切り 1 編集 削除
ディレクトリ名を「:」で区切り -
162 2行目 例えば、 python/usr/bin/spam.py として Python を起動した場合 1 コマンド python の後ろにスペースがない 編集 削除
例えば、 python /usr/bin/spam.py として Python を起動した場合 -
163 3行目 指定されたものします。 1 編集 削除
指定されたものとします。 -
164 図7.1 フォルダ構成 ... |--subpackage_spam |-- subpackage_ham.py |-- subpackage_egg.py 1 subpackage_spam ディレクトリに __init__.py がない 編集 削除
... |--subpackage_spam |-- __init__.py |-- subpackage_ham.py |-- subpackage_egg.py -
164 7-5 3行目 ディレクトリでですが、 1 編集 削除
ディレクトリですが、 -
165 3段落目の2行目 from . iport egg 1 編集 削除
from . import egg -
166 名前空間パッケージのサンプルコード sys.path.add('package_dir/project1') sys.path.add('package_dir/project2') 1 編集 削除
sys.path.append('package_dir/project1') sys.path.append('package_dir/project2') -
167 モジュールメンバの追加、削除のサンプルコード del math.f 1 編集 削除
del math.spam -
168 8行目 圧縮してspam.zipファイルを作成して 1 編集 削除
圧縮したspam.zipファイルを作成して -
169 8-1 インタラクティブシェル内 >>>> dumb_print.print("Spam!") 1 編集 削除
>>> dumb_print.print("Spam!") -
174 8-4 4,6,10,12行目 開放 1 編集 削除
解放 -
175 2-3行目 開放 1 編集 削除
解放 -
184 リスト9.2 http_loader1.py def get_filename(self, filename): 1 編集 削除
def get_filename(self, fullname): -
192 表9.3のExceptionの説明 通常の例外規定クラス 1 編集 削除
通常の例外基底クラス -
194 表9.5 キャプション インタプリタ起動時の Warnig 設定オプション 1 編集 削除
インタプリタ起動時の Warning 設定オプション -
197 zip(*iterables) 複数の iterable を受け取って、 各 iterable の同じ順序のオブジェクトを タプルにつめて返します。 1 誤りではないが、map/filter の説明で「yield で返します」と説明している、zip 関数もジェネレーターを返すので同様に説明した方が誤解がなくて良いように思う 編集 削除
複数の iterable を受け取って、 各 iterable の同じ順序のオブジェクトを タプルにつめて yield で返します。 -
206 10-1-5 サンプル2 >>> b = b'あ' 1 bytes型は非ASCII文字を指定できない 編集 削除
>>> b = b'\xe3\x81\x82' -
207 リスト10.1 count_word.py if line.indexof(search) > -1: 1 indexof って何と間違えたんだろう? list.index かな、operator.indexOf もあるのか ... 編集 削除
if line.find(search) > -1: -
207 10-1-5 サンプル3 >>> b = b'あ' >>> s = str(b) >>> print(s) b'あ' 1 編集 削除
>>> b = b'\xe3\x81\x82' >>> s = str(b) >>> print(s) b'\xe3\x81\x82' -
212 10-3-2 文字列検索ユーティリティの最終行 -encodin オプションも追加しています。 1 編集 削除
-e (--encoding) オプションも追加しています。 -
218 10-4-5のサンプルコード内 inport pickle 1 編集 削除
import pickle -
222 4行目 オプションをを含め、 1 編集 削除
オプションを含め、 -
227 11-1-1 1行目 acyncore モジュールの 1 編集 削除
asyncore モジュールの -
228 リスト11.1の下1行目 acyncore.dispatcher を継承します。 1 編集 削除
asyncore.dispatcher を継承します。 -
231 1行目 class EchoView: 1 ウェブ上のサンプルは正しいが書籍の表記が間違っている.tkinter.Frameを継承していない場合__init__関数1行目で "TypeError: object.__init__() takes no parameters" とエラーが送出される. 編集 削除
class EchoView(tkinter.Frame): -
234 11-3-1 チャットサーバ: server.py の handle_accepted のコード内 handler = EchoHandler(sock) 1 selfが右にあるのは正しい。 (2014/8/30現在)ネット上で配布されているサンプルコードもselfがないため、そのまま実行するとクライアントがサーバへアクセスするタイミングでエラーが発生する。同様に配布されている12章のサンプルコードも同じく第2引数にselfがない。 編集 削除
handler = EchoHandler(sock, self) -
234 欄外の注2 http://gihyo.jp/book/2010/978-4-7741-5539-5/support 1 2010→2013 編集 削除
http://gihyo.jp/book/2013/978-4-7741-5539-5/support -
236 12-1 配布ための準備 12-1 配布ための準備 1 編集 削除
12-1 配布のための準備 -
237 12-1-2 プロジェクトを定義する, 5行目 名前空間パッケージやパッケージ名をもとに決めるのがわかり安いでしょう 1 編集 削除
名前空間パッケージやパッケージ名をもとに決めるのがわかり易いでしょう -
237 最後の行 myproject-0.0.tar.gz 1 編集 削除
ppjp.chat-0.0.0.tar.gz -
238 setup.py のサンプルコード from setuptools import setup, find_packages 1 find_packages の注意点が説明されていて、サンプルコード中では使っていないのだからインポートする必要がない 240 ページのサンプルコードも同じ 編集 削除
from setuptools import setup -
238 12-1-2 tar の実行例 tar tvf sdist/ppjp.chat-0.0.0.tar.gz 1 編集 削除
tar tf dist/ppjp.chat-0.0.0.tar.gz -
239 12-2-2 READMEを書く ppjp.chat 1 続くパッケージの概要もREADME.txtの一部であり、背景が灰色になっていなければならないが、白になってしまっている。 編集 削除
ppjp.chat ================= -
244 ■配布物をアップロード, 2行目 uploadサブコマンドのと同時に 1 編集 削除
uploadサブコマンドと同時に -
257 13-6 第2段落 1行目 noseやpy.testなどの 1 編集 削除
noseやpytestなどの -
260 2行目 geeting関数 1 編集 削除
greeting関数 -
260 リスト14.1 basic_middleware.py, 下から6行目 m = re.match(r'Basic\s+(?P<basic_auth>\w+)', auth) 1 \w+ の指定では、Base64エンコードの special chars と padding にマッチしない 編集 削除
m = re.match(r'Basic\s+(?P<basic_auth>[a-zA-Z0-9+/=]+)', auth) -
264 14-2-2WebOb: Requestオブジェクトからパラメータを取得する例 values = request.params.get_all('values') 1 1) get_allでなくgetall 2) 前例(form_handling.py)では 'value' というパラメータから値を取得していたので、それにあわせる 編集 削除
values = request.params.getall('value') -
267 base.html を継承するサンプル <% extends "base.html" %> <h1>{{ message }}</h1> 1 編集 削除
{% extends "base.html" %} {% block body %} <h1>{{ message }}</h1> {% endblock %} -
267 14-2-5 base.htmlのサンプルの4行目 .body { 1 .bodyだと「"body"というclassをもつ要素」が対象になってしまう。 編集 削除
body { -
270 pythonパッケージの階層作成 $ touch -p py3wiki/__init__.py $ touch -p py3wiki/__main__.py 1 touchに-pというオプションはない 編集 削除
$ touch py3wiki/__init__.py $ touch py3wiki/__main__.py -
271 14-3-1 __main__.pyのサンプルコード from . import main main() 1 地べたにmainの呼び出し書いてると、importされただけて動いてしまう。とくに、テスト走らせたときにimportされてしまうのでテストが進まなくなってしまう。 編集 削除
from . import main if __name__ == '__main__': main() -
273 14-3-3 DB接続処理の追加サンプルコード engine = sa.create_engine('sqlite:///{dir}/wiki.db'.format(dir=os.getcwd())) 1 osがでてくるのは初めてなので、行頭にimport osが書かれていたほうが分かりやすいと思われます 編集 削除
import os ... engine = sa.create_engine('sqlite:///{dir}/wiki.db'.format(dir=os.getcwd())) -
275 14-3-7 page_viewの作成サンプル def page_view(request): page_name = request.urlvars['page_name'] edit_url = request.environ['webdispatch.urlgenerator'].generate('page_edit', page_name=page_name) try: page = DBSession.query(Page).filter(Page.page_name==page_name).one() tmpl = env.get_template('page.html') return tmpl.render(page=page, edit_url=edit_url) except NoResultFound: return HTTPFound(location=edit_url) 1 ここの段階で提示するサンプルコードとしては、このぐらいが適切と思われます。ちなみにedit_urlは14-3-9で、例外処理は14-3-10で追加されます。 編集 削除
@wsgify def page_view(request): page_name = request.urlvars['page_name'] page = DBSession.query(Page).filter(Page.page_name==page_name).one() tmpl = env.get_template('page.html') return tmpl.render(page=page) -
276 14-3-9 編集画面ののサンプル def page_view(request): (略) tmpl = env.get_template('page.html') 1 Wikiの編集画面はpage_edit_formのはず。 編集 削除
def page_edit_form(request): (略) tmpl = env.get_template('page_edit.html') -
285 ページ下半分の dtype属性説明用サンプル対話シェルセッションのコメント ... #配列の型の int ではなく float になる ... ... b array([[1. , 2. , 3. ], [1. , 2. , 3.3]]) 1 配列の型”の”→”は” ... c の部分はP286の部分です。 編集 削除
... #配列の型は int ではなく float になる ... ... c array([[1. , 2. , 3. ], [1. , 2. , 3.3]]) -
288 numpy 数学関数説明の対話セッション ... numpy.sin(math.pi/2)) 1 編集 削除
... numpy.sin(math.pi/2) -
290 リスト15.1 numpy1.py, 最後の行 if __name__ == '__main__': main(): 1 編集 削除
if __name__ == '__main__': main() -
293 図15.2 タイトル quad(rgt1, 0, 10)の検算 1 編集 削除
quad(ret1, 0, 10)の検算 -
299 リスト15.8 # 最初に作った配列と同じ範囲を 200 分割した配列を作成 1 編集 削除
# 最初に作った配列と同じ範囲を 180 分割した配列を作成 -
302 weave.inline, ローカル変数参照のサンプル weave.inline(source, ['x', 'y']) 1 編集 削除
weave.inline(code, ['x', 'y']) -
302 「C++側から値を返す」, 第2段落 ...C++側で暗黙に定義されるPyObject* 型の変数ret_valueに値を設定します。 1 編集 削除
...C++側で暗黙に定義されるPyObject* 型の変数return_valに値を設定します。 -
303 「C++側から値を返す」, サンプルコード code = ''' ret_value = PyInt_FromLong(x + y); ''' ... ret = weave.inline(source,['x', 'y']) 1 編集 削除
code = ''' return_val = PyInt_FromLong(x + y); ''' ... ret = weave.inline(code,['x', 'y']) -
303 「C++側から値を返す」, サンプルコード # 返値は ret_value 変数に代入する 1 編集 削除
# 返値は return_val 変数に代入する -
312 15-4-1 グラフを定義する, グラフのデータを渡すサンプルコード g = nx,Graph([(1, 2), (2, 3), (3, 4)]) 1 ドット(.)がカンマ(,)になってしまっている 編集 削除
g = nx.Graph([(1, 2), (2, 3), (3, 4)]) -
313 ■nodeやedgeの追加, p313最初の段落 edgeを追加する場合は、同様にGraphクラスのメソッドであるadd_edgeかadd_edge_fromを使います。 1 編集 削除
edgeを追加する場合は、同様にGraphクラスのメソッドであるadd_edgeかadd_edges_fromを使います。 -
341 16-3-7 オブジェクトに対する操作, 2番目のスクリプト >>> for i in range(30): ... 1 math モジュールを使用しているので、最初に import を明示的に見せてあげるほうが better 編集 削除
>>> import math >>> for i in range(30): ... -
344 第2段落, 2文目 この館数の返値は... 1 編集 削除
この関数の戻り値は... -
351 4行目 Python らいしいシンプルなコードを記述できます。 1 編集 削除
Python らしいシンプルなコードを記述できます。 -
352 POST メソッドの処理の2行前 さらに HTTP ヘッダーにも HTTP ヘッダーにも文字コードが指定されていない 1 「HTTP ヘッダーにも」が重複 編集 削除
さらに HTTP ヘッダーにも文字コードが指定されていない -
353 requests モジュールのファイルアップロードのサンプルコード files = {"attachment": ("myfile.xlsx", open("myfile.xlsx", "rw"))} 1 ファイルオープンのモードが違う? 編集 削除
files = {"attachment": ("myfile.xlsx", open("myfile.xlsx", "rb"))} -
354 ■import処理, コード例, 3行目 except ImortError: 1 編集 削除
except ImportError: -
357 最後の段落 リスト17.9のコードは、p要素でidにcopyrightが指定されている要素を検索します。 1 該当するコードには番号が振られていない 編集 削除
次のコードは、p要素でidにcopyrightが指定されている要素を検索します。 -
364 stanza_handler の9行目 event_handler と違い stanza_handler は "subscibe" や "unsubscribe" のように 1 編集 削除
event_handler と違い stanza_handler は "subscribe" や "unsubscribe" のように -
368 3行目 参加命令を発効しています。 1 編集 削除
参加命令を発行しています。 -
371 下から3行目 あまり替わりませんので 1 編集 削除
あまり変わりませんので -
371 18-1-2 redis, リスト18.2 redis1.py #(4)リストからの値の削除 client.lrem('mylist', 0, 'eggs') 1 redis-py の lrem メソッドの引数は、lrem(name, num, value)ではなく、lrem(name, value, num)。また、num のデフォルトは0。 編集 削除
#(4)リストからの値の削除 client.lrem('mylist', 'eggs', num=0) -
372 オブジェクトの生成 でmemcache.Redisオブジェクトを作成しています 1 編集 削除
でredis.Redisオブジェクトを作成しています -
377 ■データベースへの接続, サンプルコード, 1行目 from sqlalchmey import create_engine 1 編集 削除
from sqlalchemy import create_engine -
377 ■データベースへの接続 データベースのへの接続は 1 編集 削除
データベースへの接続は -
379 最初のコードサンプル return "<MailAddress(%s, %s>" % (self.name, self.address) 1 特に害は無いけど 編集 削除
return "<MailAddress(%s, %s)>" % (self.name, self.address) -
384 5行目 本稿執筆時点では Python3 系で 動作する Django はリリースされていませんし、 1 誤植ではないけど、第2刷で補足されると良さそう 編集 削除
発売前の 2013-02-26 に Python3 対応の Django 1.5 が リリースされてしまいましたね (^ ^;; https://www.djangoproject.com/weblog/2013/feb/26/15/ https://docs.djangoproject.com/en/dev/releases/1.5/ -
386 ■シリアライズ, pickleの場合のサンプルセッション pikled_data1=pickle.dumps(data1) 1 編集 削除
pickled_data1=pickle.dumps(data1) -
389 1行目 $ pssh -h hosts.txt -o /tmp -o /tmp -A -- uname -a 3 編集 削除
$ pssh -h hosts.txt -o /tmp -A -- uname -a -
401 2行目 1つ目および 2つ目の記述例はとても冗長です。reStructredText を docutils 単体で使うのであればこれしかないのですが、sphinx 上であれば3つ目の list-table を用いるのが簡単です。 1 編集 削除
1つ目および 2つ目の記述例は、パディングをする必要があるなどとても冗長です。 ソース上の見た目がテーブルではなくなってしまいますが、記述するのであれば3つ目のlist-tableを用いるのが簡単です。 -
402 autodoc の説明 conf.py の設定がない。 1 誤植ではないけど、autodoc が標準でもつ拡張機能と説明しているので、設定は必要であることを補足してあげた方が親切だと思う。 編集 削除
conf.py に以下の設定が必要。 extensions = ['sphinx.ext.autodoc'] -
404 autodoc でドキュメントを生成するサンプル .. autodoc:: sample :members: 1 autodoc というディレクティブは存在しなくて、 automodule や autofunction の誤りだと思う 編集 削除
.. automodule:: sample :members: -
404 autodoc の docstring を持たないオブジェクトを追加するサンプル .. autodoc:: sample :members: InModuleClass, ..., func_without_docstring 1 py32+sphinx113 でのみ確認。 docstring をもたないオブジェクトは :members: に追加するだけでなく、 :undoc-members: を追加しないと出力されないみたい。 編集 削除
.. automodule:: sample :members: InModuleClass, ..., func_without_docstring :undoc-members: -
451 右 A 12行目 assertメソッド 1 P115にはassertメソッドの記述はない。 assertメソッド一覧は誤字ではないので大丈夫。 編集 削除
assert文 -
454 左 M 9行目 33 432 1 編集 削除
33, 432 -
457 右 か行 17行目 クラスメソッ 1 編集 削除
クラスメソッド -
457 左 W 2行目 Web Server Gateway Interface (WSG) 1 編集 削除
Web Server Gateway Interface (WSGI) -
460 下から5行目 所謂エンたエンタープライズの 1 編集 削除
所謂エンタープライズの -
追加

書誌情報

著者Pythonサポーターズ
題名パーフェクトPython
出版技術評論社
ISBN9784774155395
発行2013-03-05
編集

関連サイト情報

出版社によるサポートページ:http://gihyo.jp/book/2013/978-4-7741-5539-5/support編集削除
追加