Python
multiline string の改行を除くイディオム
code:multiline.py
'''
hello
部分適用
functools.partial で一部の引数を埋めた関数を返す
func.__qualname__
クラス名等がついた関数名をゲットできる
bytes を書く
open(path, mode="bw") のように b が必要、デフォルトは str を書く
file.write(str(bytes_content)) は単に b'content' のような文字列が出力される
byte mode で開いたファイルに string を書いても空
first
next(filter(iterable, lambda x: x ..., None)
久々にさわると iterator の感じを忘れててめちゃ困ってしまう
pyenv install / pipenv --python 失敗
CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl@1.1)" CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.8.5
pyenv の python-build が brew に openssl あれば見てくれてないかなあ
リテラルとして解釈する
eval より安全、Spreadsheet のセルにたまに list 書いたりする時に便利...
ast.literal_eval("[1,2,3]") # => [1, 2, 3]
repl で readline が効かない
$ pip install gnureadline
Poetory
poetry update は pyproject.toml の制約を超える更新はしない
狙ったモジュールを更新するには poetry add module@latest とかする
json.dumps で unicode を \u 形式にしない
json.dumps(..., ensure_ascii=False)
line.encode('ascii').decode('unicode-escape')
map しつつ first
next(filter(None, map(lambda k: d.get(k, None), keys), None)
filter(None, itr) で lambda 省略して falthy な値を除く
C-c で死なないやつ
sleep はさみつつなんかやってる時に殺せなくて困ったことがある
signal を trap して終了させるためにこれ書いておく、他の SIG もハンドルするには同じような感じでやる
signal.signal(signal.SIGINT, lambda s, f: exit())
ロードした module を再ロードさせる
sys.modules にモジュール名を key としたオブジェクトが入っている
foo や foo.bar などパスごとなので、prefix で del していく
code:clear.py
import sys
for key in list(sys.modules.keys()):
if key.startswith('name'):
unittest.patch が
ruff
今は ruff らしい
src/ 作るかどうか
sys.path に src/ を明に通したりインストールする必要がある
それがめんどいので Editable Installs がある
? .venv/lib/python3.11/site-packages/_<module>.pth が配置されたりするのはこれ?
ローカルの Docker で動く Jupyter Notebook からカレントディレクトリの src 以下をロードしたい、なども明に追加する or PYTHONPATH=/mounted/src みたいな感じで環境変数で渡すかなあ VSCode
2023/11/29 今はこっち
python.linting.enabled 等 deprecated になっている
editable install
pip install -e . のやつ
f-string の展開
f"{name=}, {age=}" -> name='hoge', age=3
f"Big Number: {big_num:,}" -> 1,000,000
f"Hex: {num:#0x}" -> 0x1a4
f"Number: {num:09}" 000000420
f"{word:<10}" -> word
< で左, > で右はわかるが ^ で中央揃え, *^ で * で埋めつつ中央
時刻のフォーマットもできる
print(f"Date: {now:%Y-%m-%d}")
print(f"Time: {now:%H:%M:%S}")
__format__ が呼ばれている