2.7にバックポートされ未だに使える。3でしか使えない有用な機能は多く存在する。この記事はそれを紹介したスライドの引き写しである。unpackingは右辺のtupleやリストを、左辺の別々の変数に剥がす記法である。3では次のようにも書けるようになった。9])restにrangeの先頭2つ以外の残りの要素が入っている。9)aが先頭の値、bが最後の値、restがその中間の値のリストとなっている。どんなふうに使うのかファイルの行頭と行末を得るコードを簡潔に書ける。f.readlines()これは非常にPython的な読みやすさをもたらしていると感じる。somethingうーん。yohhoyの日記を見て「キーワード引数強制」が分かりやすいと思ったのでこの訳語を採用する)関数の引数宣言で*を入れると、それ以降の引数はキーワードを明示しないとエラーを出すようにすることができる。3の新しい言語機能の中で重要な部類に入ると思われる。この機能の利点は以下の4つ。オプション引数にうっかり間違った値を渡すことを防ぐ。標準に入っているmaxのような関数(リストのようなIterableまたは可変長引数を受け取れ、さらにオプション引数を持つ)を記述するさい、インターフェースをきちんと書ける。関数のAPIについて将来の変更に対する保証を与える。従来のAPIを壊すことなく新しいキーワード引数を追加できる。以下それぞれの理由について詳しく述べる。オプション引数にうっかり間違った値を渡すことを防ぐPythonにおいて関数を不正な引数で呼ぶことはよくあることで、そのときエラーを出さずにプログラムが動き続けると破滅することがありうる。以下の例はかなり作為的だが、極端なことを言えばこういうこともありうる、ということを示している。rootディレクトリを削除する!これを防ぐために、次のようにしてキーワード引数を書くことを強制できる。関数のインターフェースをきちんと書くmaxallという、標準のmax関数に似ている関数を考える。これはIterableなデータから最大値をすべて集め、リストにして返す関数だ。'bc'])、この時点では問題は起こらない。続いてこれを拡張し、標準のmaxのように、可変長引数を扱えるようにしたいと考えたとする。実装は次のように変わる。len)しようとするとエラーが出る。第2引数にkeyが入っているのか、あるいは可変長引数なのか分からないからである。keyを使うときはキーワード引数を明示するべきであり、そうしなかったときはそれが悪いということを明らかに示すエラーを出したい。key=Noneとすればよい)。2ではよりひどいことになり、明らかにコードの意図とは違った値を普通に返してくる。関数のAPIについて将来の変更に対する保証を与える。次のような雑な関数を考える。longerというそれぞれリストを受け取り、longerがshorterより長い場合、その長い分だけvalueによりリストaを伸長するというものである。実用性に乏しすぎてなんだかよく分からんが、とりあえず以下のような使い方を想定されている。10]さて、次にあなたはこの関数をリファクタリングしたいと考える。「引数longerとshorterの貰う順序は逆にしたほうが分かりやすいんじゃないか?」。次のように関数の宣言部だけ変更する。shorter):このようなことをすると明らかに処理の意味内容が壊れる(longerとshorterの意味が逆転する)。いうやらかしは意外と多く、しかも気づきにくい。いう事態を防ぎ、かつ引数の順序について柔軟性を保ちたい。そのためには、最初からキーワード引数を用いて関数のAPIを作っておき、さらにキーワード強制により引数が必要ということを機械的にチェックできるとよい。従来のAPIを壊すことなく新しいキーワード引数を追加できるこの利点は標準ライブラリで実践されている。例として、os.statを挙げる。これはファイルの情報を取得する関数で、Linuxのstatコマンドのようにシンボリックリンクを追跡する。シンボリックリンクを辿りたくない場合(シンボリックリンクそのものの情報が欲しい場合)os.lstatを使うこともできる。follow_symlinks=False)とすることでも同等のことができるようにしている。ここでキーワード強制が効いている。3ではfollow_symlinksというキーワードをつけなければ第2引数は呼び出せないように書かれているのだ。このようにしてos.statという関数を融通無碍にしているのがPython的によい作法なのだといえる。2ではキーワード強制に当たるものをどうやって実現していたかというと、**kwargsをコード中でkwargs.pop(True)などして手書きでハンドリングしていたのである。した作業から解放されるという点でもキーワード引数強制は有用である。例外をキャッチして、自分のエラーメッセージを出したい。OSErrorのようにしてOSErrorの状況を手書きで捕捉できる。これは2系を使わない理由に当たるだろう。きめ細かいOSErrorのサブクラスたち次のコードは間違っている。raiseこれはOSErrorを補足してパーミッションエラーと当て推量している。OSErrorが例外として補足されるケースというのは、ファイルが存在しなかったり、copy2であれば対象がディレクトリであった場合だったり、パイプが壊れていたりと原因は多岐にわたる。3はOSErrorのこうしたひどい状況を是正するために、多くの例外クラスを追加・修正を行った。injection")これで正しくパーミッションエラーだけが補足されている。PermissionErrorはOSErrorのサブクラスであり、古いコードでも動かすことが可能である。すべてがイテレータになるこれは多くの人が知っているだろう。すごく大きい数)を使うとメモリがあふれてプログラムが死ぬ。dict.values()などすべてがイテレータになっている。本当にリストが欲しいときはlistを使う。Implicit.)を体現している。2のややひどいところで、こんなコードが動く。2ではなんでも比較できる。3ではこういった比較は実行時型エラーを出すようになった。sortedなどはこの仕様のせいで残念な挙動をしていたので、型エラーを出してもらえるのは助かる。fromgeneratorを使うときに使える構文。range(10)generatorの話を始めると長くなるので、利点のみ挙げる。asyncio孫引きになるがこれはGuidoが挙げた例。handlerPythonがsegfaultを吐いて激しく死んだときにも有効なトレースバックを表示するライブラリ。BOOM!!killme()こんな感じらしい(使ってない)。faulthandlerでも有効化できるらしい。ipaddressIPv4/IPv6ネットワークのチェックやIPアドレスを表す文字列のチェックユーティリティ,functools.lru_cacheLRUよく分からない。メモ化を簡単に行えるデコレータだと認識している。enum3.4以降より。普通のenumで、同じメンバーを定義しようとするとエラーを出してくれるくらい。Fun(おもしろ)変数名にUnicodeが使えるよ、ということらしいが使ってよいのはletter-likeなものだけで絵文字は無理。関数アノテーション関数にこういう感じで型の符丁をつけることができる。passこれは単にこういう使い方をされるといいな、という期待を示すもので、本当に型チェックするわけではない。関数オブジェクトに___annotation__プロパティにアノテーションの内容を保存する以外なにもしない。Pythonで本当に型チェックしたい人はmypyを使うんだと思う知らんけど。unicodeとbytesこれは日本語利用者の皆さんなら散々通った道でしょう。行列の積に中置演算子@が使えるこれは3.5から使用可。2]])これがあると何が嬉しいのかはPEP465で説得的に説明されている。統計分野でnumpyを使って計算したいものに、線形仮説やら最小二乗回帰やらなんやらがあって(用語は知っていなくてもどうでもいい)、以下のような式が出てくる。)今知っておくべきことは、この式中のHとβとTが行列となっているということだ。この式は行列のドット積をたくさん取る。このような式を表現するのにnp.dotを使うと読みづらくなるので、中置記法したいという気持ちが生まれてくる。r)中置できると次のように書き直せる。r)見た目はすっきりしたことが分かるだろう。filenameという風に除算演算子でパスをつなげるようになった。感想generatorやasyncioの話題はそれだけで一個の大きな議題になるのでこういう紹介系スライドに出すのは無理があると思った(小学生並みの感想)。読み方は後半雑だけどそんなもんだ。redditで評価高かったから読んでみたんだけどコメントよくよく見たらちょっと荒れてた。*1:これあまりいいリファクタではないと思う。前者は必須の引数2つと可変長引数、という外観になっているが、後者は可変長引数だけを取るという関数になっている。これでは内部の処理内容が同じでも、関数を外から(helpとか使って)見たときの意味が変わってくる。要するに、関数の型が違う。私は、必要な引数を明示していないぶん、後者は読みづらいと感じる。型のゆるい言語という意味では誤差レベルの違いだと私は思う(Pythonistaは関数の使い方を学ぶのにドキュメントの長たらしい説明を読むのが好きな人種だと思っている。少なくとも私はドキュメント読むの好きだ)。基数...2017-01-25Pythonの簡易な壊し方r/pythonでバズったスレを垂れ流す作業。»プロフィールコメントは常に歓迎します。`ssize_t`とは何か2018-04-01【読んだもの】Pythonは逐一解釈されるのか、それともコンパイルされるのか?(答えはどちらも)イエスだ。(6)はてなブログをはじめよう!cofreeさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。