yohhoyの日記

技術的メモをしていきたい日記

Python

書式指定子の入れ子

プログラミング言語Pythonの str.format や f-string*1 において、書式指定子部のみ1段階の入れ子が許容される。下記コードではいずれも文字列 Hello!!!!! が得られる。 msg = 'Hello' '{:!<10}'.format(msg) f'{msg:!<10}' f, a, w = '!', '<', 10 '{:{}{}…

関数呼び出しのトレース

Pythonスクリプトにおいて、非侵襲的に関数呼出しと戻り値をトレースする方法。 #!/bin/usr/env python3 import inspect import sys def tracer(frame, event, arg, depth=[0]): f_name = frame.f_code.co_name if f_name == '_ag': # dirty hack for CPytho…

順序維持してJSONデータを読み込む

Python標準モジュール json ではJSONデコード結果を辞書型(dict)にて表現するため、入力JSON文字列中でのオブジェクトname/value出現順序が維持されない。2018-04-16追記:Python 3.7ではdict型の順序維持が仕様上保証されるようになる。Python 3.7 – Dictio…

wheelパッケージの対応アーキテクチャ確認

Python実行環境がサポートするwheelバイナリパッケージのアーキテクチャを確認する方法。 import pip print(pip.pep425tags.get_supported()) # [('cp34', 'none', 'win_amd64'), ('cp34', 'none', 'any'), ...] バイナリパッケージ(拡張子whl)のインスト…

お手軽__repr__メソッド実装

Pythonのユーザ定義クラスにおいて、__repr__メソッドを手軽に実装する方法。データ属性を名前順にダンプさせるためpprintモジュールを利用する。 import pprint class Node(object): def __init__(self, data, next = None): self.data = data self.next = …

空白文字を一括削除

Pythonにおいて、文字列から(タブ・改行等を含む)空白文字群を一括削除する手軽な方法。 s = " a \t b\r\n\tc\t\n" s = ''.join(s.split()) # abc 参考URL trim - Remove all whitespace in a string in Python - Stack Overflow

コンパクトなJSON表現へ変換

PythonでコンパクトなJOSN文字列(空白文字を最小限に抑える)に変換する。jq --compact-output コマンド出力相当。 import json data = { "id": 42, "name": "Foo Bar", "list": ["A", "B", "C"]} json.dumps(data, separators=(',', ':')) # 最小表現 json…

リスト内包表記中のif-else構文

Pythonのリスト内包表記でif-else構文を使うときのメモ。ifのみとの記述場所の違いに注意。 a = [1, 2, 3, 4] [x for x in a if x < 2] # [3, 4] [x if x % 2 == 0 else 0 for x in a] # [0, 2, 0, 4] [x if x % 2 == 0 else 0 for x in a if 2 < x] # [0, 4…

mutexモジュールはマルチスレッド処理には使えない

Python 2.x系にある mutexモジュール は、(その名前に反して)マルチスレッド処理には使えない。同モジュールはPython 2.6以降で非推奨、Python 3系では削除された。代わりに threading.Lockオブジェクト を利用すること。公式ドキュメント*1"mutex - 排他制…

(翻訳)書籍"Effective Python" アイテム一覧

Brett Slatkin氏による書籍"Effective Python: 59 Specific Ways to Write Better Python"より、アイテム一覧(目次)を抄訳。Python 2.x/3.x両バージョンを対象とする。 http://www.effectivepython.com/ http://www.informit.com/store/effective-python-…

Windows環境でもPythonスクリプトshebangはちゃんと書く

Pythonスクリプトのshebang(1行目の#!)*1はWindows環境でも効果がある。Windows OSにPython 3.3以降を導入すると、C:\Windowsフォルダ以下にPythonランチャ py.exe がインストールされる。Python 2/3両バージョンがインストールされている場合、同ランチ…

キーワード引数の強制

Pythonの関数定義において、キーワード引数形式でのみ実引数を渡せる(keyword-only arguments)よう強制する方法。 # Python 3.x def f(a, b, *, x=None, y=None): print("a={} b={} x={} y={}".format(a, b, x, y)) f(1, 2) # OK: a=1 b=2 x=None y=None f(1…

自作デコレータの書き方

Pythonで自作のデコレータ(decorator)記述方法についてメモ。functoolsパッケージを利用すると、デコレータ式適用後にも元関数の__name__や__doc__を簡単に引き継げる。(汎用デコレータでなければ不要かもしれない) 引数無しデコレータ @my_deco def func(…

raw文字列の落とし穴

Pythonのraw文字列(raw string)記法では、その末尾を奇数個のバックスラッシュ(\)とできない。Windows上のフォルダパス名を表現するときなどで特に注意。 # SyntaxError: EOL while scanning string literal が発生 path_ng = r"C:\User\foobar\" path_ok = …

文字列フォーマット中の変数展開

プログラミング言語Pythonにおいて、Perl, PHPの変数展開や、Rubyの式展開(の変数名のみ)をエミュレーション。引数なしvars関数の代わりにlocals関数でもOK。 a = 42 b = "abc" print("a={a}, b={b}".format(**vars())) # 出力: a=42, b=abc 関連URL strin…

リスト内包表記と変数スコープ

プログラミング言語Pythonにおけるリストの内包表記と変数スコープの関係についてメモ。 x = 42 a = [x for x in range(1,10)] print(x) Python 2.x系: 9 Python 3.x系: 42 In Python 2.3 and later releases, a list comprehension "leaks" the control var…

ワイルドカードの展開

Pythonでファイル名のワイルドカード展開を行う。 # expand_wc.py import sys, glob, operator print sys.argv[1:] # 展開前 sys.argv = reduce(operator.add, map(glob.glob, sys.argv)) print sys.argv[1:] # 展開後 実行結果: $ ls abc.txt xyz.txt expa…