effective python 第2版の翻訳改善点 8〜10章

オライリー・ジャパンから発売された「Effective Python 第2版 Pythonプログラムを改良する90項目」の日本語訳の改善提案である。気になった箇所について、原文と照らし合わせて問題点を述べ、日本語訳を自分で書き直している。

注意事項

「Effective Python 第2版」の日本語版をAmazonで、原著(電子書籍版)をInformIT(ピアソン社の電子書籍販売サイト)で購入した。
以下でそれぞれの本の文章の一部を書いているが、著作権法で定められた引用に該当する。 これは訳文の批評のために必要不可欠な引用である。

  • 選んだ箇所は私が問題だと思った部分である。文章の意味が間違っているところ(誤訳)と、文意が分かりづらいところとが混じっている。(両者をハッキリ判別するのは難しいので、どの部分がどちらかを示すことはしていない。)
  • ページ数は日本語版のページ数を示す。原著のページ数は省略した。
  • 日本語版:」のあとに続く部分は「Effective Python 第2版」の日本語版からの引用である。
  • 原文:」のあとに続く部分は「Effective Python: 90 Specific Ways to Write Better Python (2nd Edition)」原著からの引用である。
  • また、「直訳」および「意訳」は原文から私がオリジナルで訳した文である。
  • 直訳」は英語の単語を極力そのまま日本語に置き換えたもの。
    • 常に常体である。
    • 「I / you」も訳出している。
    • 高校の授業でやる英文和訳のような結果になるので、日本語として不自然な場合もある。
  • 意訳」はそこから構文の変更などを加えて日本語として整えたものである。
    • 常体か敬体かは元の日本語訳と同じとした。
    • 「I / you」は日本語訳と同様、訳出しないことにした。
    • 仮に私が翻訳するとしたら「意訳」の文章を最終結果にするであろう。

その他、翻訳改善点を書く際に考えたことは以前に書いた1〜3章の記事を参照してほしい。

linus-mk.hatenablog.com

なお、前記事で1〜3章、本記事で8〜10章についてあつかっているので、残りは4〜7章である。 しかし、残りについてまとめる予定は今のところありません。翻訳改善点を書くのは、だいぶ労力がかかるので……。

8章

p.289 項目65

  • 日本語版:else節は、try/exceptの後で起こることは、見た目にも、exceptブロックとは異なるということを保証します。
  • 原文:The else clause ensures that what follows the try/except is visually distinguished from the except block.

「見た目にも……異なる」ってどういうこと?
逐語訳としては間違ってない気がするけど、何が言いたいのかどうにも伝わりにくいような……
主語の「else節」は思い切り無生物主語なので、うまく書き直したいところ。こんなもんでどうだろうか。意訳は2通り書いてみた。

  • 直訳:else節は、try/exceptの後で起こることがexceptブロックと視覚的に区別されていることを保証する。
  • 意訳:else節を使って書けば、try/exceptの後続の処理を、exceptブロックと見た目にも切り離しておくことができます。
  • 意訳:else節を使って書けば、try/exceptの後続の処理を、exceptブロックとは別々のものだと見て分かるようになります。

p.300 項目68

  • 日本語版:pickleの本来の目的は、Pythonオブジェクトを自分がコントロールしているバイナリチャネルでプログラム間をまたいで渡すことです。
  • 原文:The purpose of pickle is to let you pass Python objects between programs that you control over binary channels.
  • 直訳:pickleの目的は、あなたに、あなたが管理するプログラムの間で、バイナリの経路の上でPythonオブジェクトを渡させることである。
  • 意訳:pickleの目的は、自分が管理するプログラムどうしの間で、バイナリの経路を通じてPythonオブジェクトを渡すようにできることです。

このすぐ下の文も悪訳。(次項で扱う。)続けざまに悪訳が出てきたんだけど、どうした一体?

日本語版の翻訳だけど、多分これはcontrolとoverをセットで訳してるよね。 「自分がコントロールしているバイナリチャネル」のあたり。(冷静に考えるとこの訳なら原文はbinary channels (that) you controlじゃないとおかしくないか?)
controlが名詞ならそれにoverが結びつくのはよくある。が、今回のcontrolは動詞だ。動詞controlとoverを使う例は辞書でも見つからなかった。
正解は、passとoverがセットになって結びついているのだ。したがってcontrolとoverは意味の上では分かれている。下記に、pass X over Yの形になっている文の例を示す。
channel=経路 をオブジェクトが通っているので、through channelsかin channelsあたりのような気がするが、overが正解なのか……この辺の前置詞の感覚はよく分からないわ。
動詞letについては、ややenableっぽく訳してみた。

参考:
He passed his over his face. 手で顔をなでた
pass one's eye over a letter 手紙に目を通す
(英語活用大辞典より)

p.300 項目68

  • 日本語版シリアライズしたデータは、本質的には、元のPythonオブジェクトをどのように再構築すればよいかを記述したプログラムを含む。 これは、悪者のpickle情報がデシリアライズしようとするPythonプログラムのどの部分にも忍び込むのに使われうるということを意味する。
  • 原文:The serialized data contains what is essentially a program that describes how to reconstruct the original Python object. This means a malicious pickle payload could be used to compromise any part of a Python program that attempts to deserialize it.

日本語版では「pickle情報が」に対応する述語がどこなのか分かりにくいと思う。

日本語に翻訳するとき、普通は能動態か受動態かで迷ったら能動態で書いたほうが収まりが良いけど、 今回はcompromiseを受動態として訳したほうがスッキリしたのでそうした。
「誰かが不正にアクセスする」という文よりも「システムが不正にアクセスされる」という文を見かけることが多いからかな?

  • 直訳シリアライズされたデータは、本質的には元々のPythonオブジェクトを再構築する方法を記述したプログラムであるものを含む。 これは、悪意のあるpickleペイロードが、それをデシリアライズしようとするPythonプログラムの任意の部分に不正アクセスするのに使われる可能性があるということを意味する。
  • 意訳シリアライズされたデータには、元々のPythonオブジェクトを再構築する方法を記述したプログラムと同等のものが含まれている。 したがって、悪意のあるpickleペイロードがあると、それをデシリアライズしようとするPythonプログラムの任意の部分が不正にアクセスされてしまう可能性がある。

p.309 項目69

  • 日本語版:Decimalクラスでは、丸めのための組み込み関数があり、望ましい丸め操作を正確に必要な桁数で丸めてくれます。これで、抱えていた切り上げ問題が解決されます。
  • 原文:Luckily, the Decimal class has a built-in function for rounding to exactly the decimal place needed with the desired rounding behavior. This works for the higher cost case from earlier:

「丸め操作を……丸めてくれます」ってどういうことよ。「馬から落馬する」とか「頭痛が痛い」と同様にダメだと思うんだけど。

  • 直訳:幸運なことに、Decimalクラスは、所望の丸め挙動によって10進法地点へ正確に丸める操作のための組み込み関数を持つ。これは、始めにあったより高い料金の例でもうまくいく。
  • 意訳:幸いにもDecimalクラスには組み込み関数があり、希望どおりの丸め方で数値を10進法の数値に正確に丸めることができます。これは、始めに挙げたより高い料金の例でもうまくいきます。

rounding to exactly the decimal place(原文)と
rounding to the exact decimal placeの違いって何なんだ……exactlyがroundingを修飾するならtoの前になるんじゃないか……分からないや。

なおおまけの指摘だが、この項目69でずっと小数点2桁で四捨五入/切り上げをしているのはセント単位にしたいからである。
原文では「round to the nearest whole cent」つまり「最も近い、セント単位の数に丸める」という意味である。 「round ~ to the nearest whole number 小数点第1位で四捨五入して整数にする」が英辞郎にあったので、numberの代わりにcentが入った形だろう。 何でwholeなのかcentが単数なのかよく分からんけど。
英文にあった「セント」が日本語版では完全に消えている。 「最も近い整数への丸め方式(p.308 上部)」じゃ意味が通らないだろう。だって四捨五入の結果である5.36は整数じゃないんだから。

9章

p.357 項目78

  • 日本語版:厳密には、どのdatabaseオブジェクトでも取れるように、一部の引数が使えるのであれば、定数unittest.mock.ANYを、どんな引数でも取れることを示す値として使います。
  • 原文:If I actually don’t care about some of the individual parameters, such as exactly which database object was used, then I can indicate that any value is okay for an argument by using the unittest.mock.ANY constant.

「individual parameters」つまり個々のパラメータの一部の例として、「exactly which database object was used」=「正確にどのdatabaseオブジェクトが使われたのか」がある。日本語版では、exactlyに相当する「厳密には」が変なところにあるし、文意がよく分からない。
挿入句がちょっと訳しづらい。カッコに入れるくらいしか上手いやり方が思いつかない。以下のようになる。

  • 直訳:もし実際には私が個々のパラメータの一部(例えば「正確にどのdatabaseオブジェクトが使われたのか」など)には関心がないのであれば、私はunittest.mock.ANYという定数を使うことで、その変数にはどんな値でも大丈夫であることを示すことができる。
  • 意訳:もし実際には個々のパラメータの一部(例えば「正確にどのdatabaseオブジェクトが使われたのか」など)が重要でないのならば、unittest.mock.ANYという定数を使って、その変数にはどんな値を入れても構わないことを示すことができます。

単純な誤字脱字

気づいた範囲で書いておきます。

p.343
実際の型とか構成部分がはっきりしていなことです。

実際の型とか構成部分がはっきりしていないことです。

p.348
try/excep 文とよく似ていて、

try/except 文とよく似ていて、

p.356 (ページ中央のAtributeErrorのすぐ下)
daabase引数にはobjectを使います。

database引数にはobjectを使います。

関連記事

linus-mk.hatenablog.com

linus-mk.hatenablog.com

終わりに

目についたところを挙げた。しかし、すべて完全に読んだわけではないので、まだ見逃しているところがあると思う。 「Effective Pythonのこの部分の文章の意味がよくわからないんだけど!」というのがあれば、コメント欄とかTwitterで言ってくれれば見てみます。この記事に加筆するかもしれません。