yohhoyの日記

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

Python

... in Python3

Python3のEllipsisリテラル...の一風変わった使い方。擬似コード風のプレースホルダとして利用可能。 def func(): ... # 以下と等価 # def func(): # pass 2008年1月のPython3検討メーリングリスト*1より、Guido van Rossum氏*2による投稿を引用。 Some folk…

関数/ラムダ式への値束縛

プログラミング言語Pythonにおいて、関数やラムダ式にローカル変数の「値」を束縛する方法。下記コードでは “引数xを定義時の値nで冪乗” する関数を個別生成するつもりが、実際には “引数xを変数nの値で冪乗” する同一の関数が生成される。forループ終了後の…

名前によるUnicodeリテラル表現

PythonではUnicodeコードポイントによるリテラル表現*1の他に、Unicode文字データベース(UCD; Unicode Character Database)*2に準じた名前表現もサポートする。 print("\U0001F4DB") # print("\N{NAME BADGE}") # print("\N{TOFU ON FIRE}") # SyntaxError…

書式指定子の入れ子

プログラミング言語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 CPyt…

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

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

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 python - Remove all whitespace in a string - Stack Overflow

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

PythonでコンパクトなJSON文字列(空白文字を最小限に抑える)に変換する。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モジュールはマルチスレッド処理には使えない

2020-01-01をもって Python2はEOL を迎えている。Python 2.x系にある mutexモジュール は、(その名前に反して)マルチスレッド処理には使えない。同モジュールはPython 2.6以降で非推奨、Python 3系では削除された。代わりに threading.Lockオブジェクト を…

(翻訳)書籍"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-pytho…

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 2020-01-01をもって Python2はEOL Python 3.x系: 42 In Python 2.3 and later releases, a list compr…

ワイルドカードの展開

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…