タグ

ブックマーク / atsuoishimoto.hatenablog.com (25)

  • Python 3.8 の概要 (その5) - デバッグ用 f文字列フォーマット - atsuoishimoto's diary

    Python3.8の新機能で、これ一番好きかも。このためだけにPython3.8必須にしてもいい。 通常、 f文字列 に変数名や式を指定すると、その値が文字列に埋め込まれます。 >>> foo, bar = 10, 20 >>> print(f'value is {foo+bar}') value is 30 便利な機能ですが、デバッグ用にデータを出力するときには、ちょっと面倒です。たとえば foo と bar の値を確認するときは、確認したい変数名のテキストと、表示したい式を別々に書く必要があります。 >>> print(f'foo={foo} bar={bar} foo+bar={foo+bar}') foo=10 bar=20 foo+bar=30 そこで、f文字列に出力指定方法が追加され、出力したい式に続けて = を指定すると、その式と式の値の両方が文字列に埋め込まれるようになりま

    Python 3.8 の概要 (その5) - デバッグ用 f文字列フォーマット - atsuoishimoto's diary
  • Python 3.8 の概要 (その1) - Assignment expressions - atsuoishimoto's diary

    古来、Pythonでは「代入は文であるべき!」と一貫して主張してきました。 C言語などでは、代入は足し算や掛け算と同じ、値を計算する「式」で、たとえば a = (b=100) / 2; と書くと、b には 100 を代入し、a に 100/2=50 を代入します。1+1 は 2 という値になる 式 ですが、b=100 も同様に値が 100 となる 式 なのです。 Pythonでは、代入は式ではないので、こういう書き方はできません。 Pythonの代入は、足し算などの演算子の仲間ではなく、if や for のような制御文の仲間で、あまり自由な書き方は出来ないのです。 Python FAQ では、その理由として Python の式中での代入を許さない理由は、この構造によって起こる、他の言語ではありがちで見つけづらいバグです: if (x = 0) { // error handling } e

    Python 3.8 の概要 (その1) - Assignment expressions - atsuoishimoto's diary
    raimon49
    raimon49 2019/09/03
    Guido引退のきっかけ
  • The Zen of Python 解題 - 前編 - atsuoishimoto's diary

    The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In

    The Zen of Python 解題 - 前編 - atsuoishimoto's diary
    raimon49
    raimon49 2019/03/31
    The Zen of Pythonを書いたTim Peters氏のPythonへの貢献、MLで見られる言い回し、正体について数多くあった説について。
  • 備忘録 - #python3 で sys.std(in|out|err) の encoding を強制する について - atsuoishimoto's diary

    備忘録 - #python3 で sys.std(in|out|err) の encoding を強制するについて C言語の教科書にでも出てきそうなこんな基礎的なスクリプト import sys for l in sys.stdin: print l が動かない!って文句を言いたくなる気持ちは、非常によく理解できる。Unix的なというかC言語的には伝統的かつ完璧なイディオムで、これが正常に動作しないなんてどうかしてる。どんなプログラミング言語でも、Hello Worldの次ぐらいにはこんなプログラムを書いて、IOの使い方を試してみるものだ。 しかしながら、現代はもうUnicode時代なわけで、いや、少なくともPython3はUnicode時代であると定めてしまったわけで、K&R時代ならなんの問題もなかったこんな処理でもエラーになってしまう、そんな時代に我々は生きているのである。 何が問題か

    備忘録 - #python3 で sys.std(in|out|err) の encoding を強制する について - atsuoishimoto's diary
    raimon49
    raimon49 2012/08/07
    Unicode時代の心構え テキストIOとバイトIO
  • あなたの知らないPython3の秘密 - atsuoishimoto's diary

    関数の引数は最大255個まで def f(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77,

    あなたの知らないPython3の秘密 - atsuoishimoto's diary
    raimon49
    raimon49 2012/06/11
    知らなかった
  • Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - atsuoishimoto's diary

    アプリケーションを作成して配布するとき、配布するのは複数のファイルやディレクトリではなく、ファイル一つだけで済ませることができたらそれに越したことはないだろう。Pythonには cx_Freeze や py2exe のような、プラットフォーム固有な実行可能ファイルを開発するための環境も揃っているが、ここではもうちょっとライトに、Pythonの実行環境があれば実行できる zip ファイルの作り方を紹介したい。例として、flaskを使った簡単なWebアプリケーションを作ってみよう。 尚、ここで作成したファイルは https://github.com/atsuoishimoto/demo_pkgrsrc に置いてあるのでご参照いただきたい。 リソースファイルの使い方 普通、アプリケーションにはスクリプトファイル以外にいろんなファイルが含まれる。この例のようなWebアプリケーションではHTMLやC

    Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - atsuoishimoto's diary
  • mockはこう使え - atsuoishimoto's diary

    最近、Mockライブラリ http://www.voidspace.org.uk/python/mock/ を使ってみたのでメモ。 このライブラリは、その性質上、動的にメソッドや属性を作成するケースが多く、普通のPythonライブラリのようにイントロスペクションに頼って使い方を調べるのは難しい。気で使うならまじめにドキュメントを読み込む必要がある。 関数の置き換え テスト中に呼び出される関数をMockで置き換える例。ここでは、関数 myapp.utils.func1() を置き換える。 from mock import Mock import myapp.utils # myapp.utils.func1 を、常に100を返す関数に置き換える myapp.utils.func1 = Mock(return_value=100) 戻り値が定数でない場合は、Mock()にside_effec

    mockはこう使え - atsuoishimoto's diary
  • Re:Python とクロージャ - atsuoishimoto's diary

    @kumagi: @shomah4a 記法をちょっと改める事で回避出来るというのも謎ですし、なぜリストならクロージャ出来るのかわからないのですがどういう哲学でこんな設計になってるのでしょうorz http://d.hatena.ne.jp/shomah4a/20110909/1315542720 関数をネストできるようなプログラミング言語でスコープの扱いをどうするかという話だが、現実に可能な解決手段というのはそれほどないもので、いろんなパターンを考えてみて、それぞれのメリット・デメリットを考えてみれば、同意はできないにしろ理解はできるんじゃないかと思う。 ちなみにPythonのスコープ設計の論拠は PEP 227 -- Statically Nested Scopes にまとめられていて、この文書によれば親スコープの変数の再設定ができないのは主にGuidoの反対が理由だったようだ。私の記憶

    Re:Python とクロージャ - atsuoishimoto's diary
    raimon49
    raimon49 2011/09/18
    PEP 227 「それクラスで」
  • メソッドオブジェクトの不思議とid()の落とし穴 - atsuoishimoto's diary

    さて、@aroma_blackさんがこんなスクリプトで悩んでおられたのである。 class C(object): def foo(self): pass c = C() print id(c.foo) == id(c.__class__.foo) print c.foo is c.__class__.foo @aroma_blackさんはメソッドオブジェクトがどこに隠れているのか調べていたようだ。この二つのprint文で出力される結果はおわかりだろうか。 c.foo is c.__class__.foo まず、二番目のprint文から見てみよう。 c.fooは見た通り、Cクラスのインスタンス c からメソッド foo を取得する式である。 >>> c.foo <bound method C.foo of <__main__.C object at 0x02A8B3B0>> c.fooでは、

    メソッドオブジェクトの不思議とid()の落とし穴 - atsuoishimoto's diary
    raimon49
    raimon49 2011/05/01
    >Pythonではbound methodオブジェクトを参照されるたびに生成し、インスタンスにはbound methodオブジェクトへの参照を持たないようにしている
  • Python2のstrは死んだ - atsuoishimoto's diary

    Python3の概略をざっと聞くと、Python3ではPython2のユニコード型が文字列型になり、文字列型はバイト文字列型になった、というイメージを持ってしまう人も多いだろう。Python2の s="spamspamspam" は、Python3の s=b"spamspamspam" と同じだ、と。 しかし、Python3に"バイト文字列"なんて存在しない。あるのは "bytes"だ。複数形を示す "s"に注意しよう。bytesはバイトのコンテナであり、バイトとは整数値だ。バイトは文字ですらないのだ。 そう、だからもう認めよう。Python2のstrは死んだ。Python3にはもう存在しない。strは消え去った。お亡くなりになった。お隠れになった。成仏した。主の御許に召された。バージョン履歴に残るゴミクズとなった。その生涯は幕を閉じ、アンコールに応じることもないのである。 strとbyt

    Python2のstrは死んだ - atsuoishimoto's diary
  • is演算子のふしぎ - atsuoishimoto's diary

    Pythonには、二つのオブジェクトが同じオブジェクトかどうか判定する is演算子というのがある。==演算子とちょっと似ているが、==演算子は二つのオブジェクトの値が等しいかどうかを判定し、is演算子は値に関わらず異なるオブジェクトが指定されればFalseを返す。 >>> list1 = [1,2,3] >>> also_list1 = list1 >>> list2 = [2,3,4] >>> equal_to_list1 = [1,2,3] >>> list1 is also_list1 # list1 と also_list1 は同じオブジェクト True >>> list1 is list2 # list1 と list2 は異なるオブジェクト False >>> list1 == list2 # list1 と list2 は異なる値を持つ False >>> list1 is

    is演算子のふしぎ - atsuoishimoto's diary
    raimon49
    raimon49 2011/04/14
    オブジェクトの再利用するか否かは実装依存。
  • Pythonバージョンの選びかた - atsuoishimoto's diary

    Pythonはおよそ18ヶ月ごとに新しいメジャーバージョンをリリースする慣習になっていて、これまでにたくさんのバージョンがリリースされ、広く利用されてきた。Pythonの開発では後方互換性を保つことが非常に重視されていて、通常のアプリケーションであれば、Pythonのアップデートで動かなくなってしまうことはあまりない。アプリケーションが今後廃止される予定になっている機能を利用していると、DeprecationWarningという警告が出力されてしまう程度だ。 DeprecationWarningが出るようになってから実際に廃止されるまで少なくとも数年間はあるので、普通はその間にのんびり対処する事ができる。また、いったん廃止予定と決定されても、その機能が一部で使い続けられている場合には実際には削除されない、というケースも非常に多い。Pythonのドキュメントを見てみると、もう10年も前から廃

    Pythonバージョンの選びかた - atsuoishimoto's diary
    raimon49
    raimon49 2011/04/09
    プラットフォーム別
  • リストのかけ算 - atsuoishimoto's diary

    Python初学者が引っかかる落とし穴に、 seq = [[]] * 5 seq[0].append('A') print(seq) としたとき、どのような出力が出るか?というのがある。 一見、 [['A'], [], [], [], []] となりそうだが、実際には [['A'], ['A'], ['A'], ['A'], ['A']] となる。 seq = [[]] * 5 という文はちょっとごちゃごちゃして分かりにくいのでちょっと書き直してみると item = [] seq = [item] * 5 と同じだ。まず空のリストを一つ作成し、そのリストを要素とする長さ1のリストを作る。そして長さ1のリストを *5 して長さ5のリストを作成し、 seq に 代入する。Pythonスクリプトとして書き直すと: def list_mul(seq, n): ret = [] for i in r

    リストのかけ算 - atsuoishimoto's diary
    raimon49
    raimon49 2011/04/09
    >シーケンスのかけ算は、要素と同じ値のオブジェクトを作成するのではなく、同じ要素を乗数分持ったリストを作成する演算であることを憶えておこう。
  • func_closureのひみつ - atsuoishimoto's diary

    Pythonでデコレータで修飾した関数から、修飾される前の関数を取り出したいというニーズは多いようで デコレータ式を適用した関数から元の関数名を探す - gumi Engineer’s Blog デコレータを外す - logiqboard デコレータを取り除いて見たかった。 - podhmoの日記 のようなブログエントリが上がっているが、Pythonでは元の関数を取り出す確実な手法は用意されていないので諦めていただきたい。デコレータを使って関数を定義しても、Pythonはその情報をどこにも記録していない。 必要であれば http://docs.pylonsproject.org/projects/venusian/dev/ のようにデコレータ自身に細工をする、テスト対象モジュールのインポート時にフックを入れ、修飾せずに元の関数を返すデコレータに置き換えるなどとするしかないだろう。 自由変数

    func_closureのひみつ - atsuoishimoto's diary
    raimon49
    raimon49 2011/04/02
    func_closure/__closure__を見てもデコレート元関数を確実に見付けられる訳ではない理由。「自由変数を持つ関数がクロージャ」っていう定義がとても分かり易い。
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ - atsuoishimoto's diary

    5.1 getc()とputc()を用いて標準出力へコピーする import sys while True: c = sys.stdin.read(1) if not c: break sys.stdout.write(c) 5.2 fgets()とfputs()を用いて標準出力へコピーする import sys for line in sys.stdin: sys.stdout.write(line) Pythonにはgetc()/putc()/fgetc()/fput()がないので、ここでは似たような機能で再実装してみた。 サンプル5.1 はsys.stdin.read()を使って、一文字ずつ読み込んでいる。サンプル5.2では、sys.stdinをfor文を使って読み込み、一行ずつ出力している。 5.3 さまざまな標準入出力ストリームのバッファリング方式を表示する 残念ながら、Pyth

    Pythonで学ぶ「詳解 UNIXプログラミング」(その5) 第5章 標準入出力ライブラリ - atsuoishimoto's diary
    raimon49
    raimon49 2011/03/19
    Cで言うところのgetc()/putc()/fgetc()/fput(), tempfileモジュール
  • UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary

    最近、ときどきTwitterで「Python」を検索して眺めていたのだが、Pythonの分かりにくいところとして「UnicodeDecodeErrorが出てうざい」という不満をよく見かけるようだ。 確かに、Pythonでは、数字やアルファベット以外のユニコード文字を使おうとすると、対応する処理を書かなければUnicodeEncodeErrorやUnicodeDecodeErrorが出てしまう。Python3では色々改善されているのだが、Python2では分かりにくい点も多い。 このUnicodeDecodeErrorを見て、「Pythonは日語が苦手だ」と考えてしまう人も多いだろう。確かにそう思ってしまっても仕方がないが、それは正しくない。日人だけでなく、アメリカ人でもフランス人でもドイツ人でも、ユニコードを使う時はみんな等しく平等にこのエラーを出しているのである。 もちろん、慣れてし

    UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング - atsuoishimoto's diary
    raimon49
    raimon49 2011/03/13
    UnicodeEncodeErrorを発生させないためのプラクティス。なるべく自動変換させない。
  • Pythonで学ぶ「詳解 UNIXプログラミング」(その1) 第1章 概論 - atsuoishimoto's diary

    1.1 ディレクトリ内の全てのファイルをリストする import sys, os if len(sys.argv) != 2: sys.exit("a single argument (the directory name) is required") try: filenames = os.listdir(sys.argv[1]) except OSError: sys.exit("can't open {0}".format(sys.argv[1])) for filename in filenames: print filename sys.exit(0) Pythonでは、opendir()/readdir()/closedir()を個別に呼び出す必要はなく、os.listdir()だけでファイル一覧を取得することができる。ただし、readdir()と違って、os.listdir(

    Pythonで学ぶ「詳解 UNIXプログラミング」(その1) 第1章 概論 - atsuoishimoto's diary
    raimon49
    raimon49 2011/03/07
    OSに近い低レベルのファイル操作をPythonで安全に扱うレシピ
  • James Gosling Interview about Java - atsuoishimoto's diary

    2011年1月1日に、IEEEの "Computer"マガジンは James Gosling にインタビューを行った。インタビュアーは、Gosling が作った言語(訳注:もちろんJavaのこと)を用いてのオブジェクト指向デザインに関して、この21年間を回顧するインタビューが取れるものと思っていた。しかし、インタビューが進むに連れ、もともと取材しようとしてたものよりも衝撃的な記事を得ることになった。その後、業界への衝撃が強すぎるとして、 編集者はその取材記事をボツにしたが、 こういうものには情報のリークが付き物である。 以下、インタビューの生の記録をお届けする。編集を行っておらず、またぶっつけ番であるため、原稿のあるインタビューのようにはきちんとしていないが、きっと読者は興味を感じてくれるものと思う… 尚、このインタビューの背景を正しく理解するために、同じインタビュアーによる Bjarn

    James Gosling Interview about Java - atsuoishimoto's diary
  • あなたの知らないPythonのひみつ - atsuoishimoto's diary

    Pythonでは、ループ・try・withブロックは最大20までしかネストできない。 >>> def spam(): ... while 1: ... while 2: ... while 3: ... while 4: ... while 5: ... while 6: ... while 7: ... while 8: ... while 9: ... while 10: ... while 11: ... while 12: ... while 13: ... while 14: ... while 15: ... while 16: ... while 17: ... while 18: ... while 19: ... while 20: ... while 21: ... print "Deep!" ... SystemError: too many statically n

    あなたの知らないPythonのひみつ - atsuoishimoto's diary
    raimon49
    raimon49 2011/03/01
    多重ネストしても美しいPython
  • Pythonの粗大ゴミ - atsuoishimoto's diary

    なんかgcネタが続いてしまうが、先日のPython Hack-a-thon で発表した中で、「ジェネレータオブジェクトが解放されない場合がある」というのは、あまり知られていないようだ。Python公式ドキュメントを確認してみると、どうやらこちらにも書かれていない。知らないとハマってしまう場合もあるので、もうちょっと詳しく解説しておこう。 ガベージコレクションで解放されないオブジェクト まず、ちょっと復習しておこう。Pythonのガベージコレクション機構では、__del__() メソッドを持ったオブジェクトで循環参照を作ってしまうと、そのオブジェクトは自動的には解放されなくなってしまう。 例えば、次のように __del__() メソッドを持つクラスを定義する。 class UnCollectable: "__del__()メソッド付きクラス" def __del__(self): print

    Pythonの粗大ゴミ - atsuoishimoto's diary
    raimon49
    raimon49 2011/02/28
    循環参照 __del__(), ジェネレータでtryブロック