TIL

Today I Learned. 知ったこと、学んだことを書いていく

Python

【Python】typing.NamedTuple を使う

typing.NamedTuple: 型がついているcollection.namedtupleを定義できる 書き方 from typing import NamedTuple, Optional class Table(NamedTuple): name: str alias: str default値の設定 デフォルト値の設定されていないフィールドの後ろのみ書ける from t…

Neovim内で使うpythonをpyenvのアクティブなものにする - Neovim

g:python3_host_progに値をセットする(Python3の場合) g:python3_host_progに値をセットすると、neovim内で実行するpython3を指定できる pyenvのアクティブなPythonを使うようにするには、以下のように~/.config/nvim/.init.vimに書く let g:python3_host_pr…

prompt-toolkitで検索ツールバーの実装と、インクリメンタル検索の実装した - Python

単純な検索機能を実装する 実装手順 実装するときにつまづいたこと 次の検索結果への移動の実装方法がわからなかった filters.is_searchingがなんなのかよくわからなかった search_linksを調べてみた nとNが検索文字列入力中に打てなくなってしまった インク…

指定フォルダ以下のファイルをコピーする - Python

指定のフォルダの下にあるファイルをコピー 再帰的に見ていく 再帰的にファイルを見るのにpathlib.Path.glob()を使い、ファイルをコピーするのにshutil.copy()を使う 例)C:\sample以下のファイルで、ファイル名に"a"が含まれているファイルをカレントディレ…

nonlocal ネストした関数から変数にアクセスする - Python

ネストした関数で、上で定義された変数を使うにはnonlocalキーワードを使う def main(): a = 1 def child(): nonlocal a a += 1 print(a) print(a) child() print(a) main() 出力結果 1 2 2 ネストした関数から、アクセスできた!! これは、メモ化のための…

【Windows】フォルダをエクスプローラで開く - Python

subprocessモジュールのcallを使う import subprocess subprocess.call(f'explorer "{開くフォルダのパス}"') 参考文献 [python] エクスプローラをファイルに開く [windows] [explorer] | CODE Q&A 問題解決 [日本語]

os.path.expanduser関数 - Python

カレントユーザのホームディレクトリのパスを取得することができる >>> os.path.expanduser('~/src/python/') '/Users/tamago324/src/python/' 使えるときあるのかな? 参考文献 Python Tips:カレントユーザのホームディレクトリのパスを取得したい - Life …

keybindingに渡されるeventという引数は何者!? - Python

keybindingのメソッドに渡されるeventという引数は何者? prompt_toolkit.key_binding.key_processor.KeyPressEventというやつ https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/prompt_toolkit/key_binding/key_processor.py#L412 dat…

カーソルがある行のインデックス番号を取得 - Python

python-prompt-toolkitでカーソル行のインデックス番号を取得したいとき prompt_toolkit.document.Document.cursor_position_row カーソルがある行のインデックス番号が取得できる 0から数える from prompt_toolkit.application import Application from pro…

Bufferのread_onlyを一時的にOFFにしたいとき - Python

Bufferのread_onlyがAlways()だと、Bufferのtextとかdocumentとか何も変更できないから、Never()にする必要がある form prompt_toolkit.filter import to_filter # read_onlyをONにする right.content.buffer.read_only = to_filter(True) # read_onlyをOFF…

has_focus(value)で渡したUIControl(Window)にフォーカスがあるか確認する - Python

指定したコントロールにフォーカスがあるかどうか prompt_toolkit.layout.layout.Layout.has_focus()で確認できる has_focus(value) Check whether the given control has the focus. :param value: UIControl or Window instance. Reference — prompt_toolk…

vimっぽいページスクロール(c-dとc-u)をpython-prompt-toolkitで実装 - Python

python-prompt-toolkitを使って、ページのスクロールを実装したからメモメモ 以下の2つだけとりあえず、実装してみる https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/prompt_toolkit/key_binding/bindings/page_navigation.py#L48-L6…

複数行で書きたい時 - Python

()でくくる s = ('hello' 'world') print(s) helloworld print(('hello' 'world')) helloworld 参考文献 長い文字列リテラルの定義にはヒアドキュメントや('...' '...')が便利 - Qiita

PipenvでImportError: cannot import name 'get_installed_distributions'ってエラー出た

pipenvのgraphしたらエラーが出たから、その時の対処のメモと言うか、いらないと思うけど、メモっとく $ pipenv graph Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/pipdeptree.py", line 17, in <module> from </module>…

gzipモジュールを使った圧縮と展開 - Python

vcrpyでは、レスポンスの量が多い場合、圧縮されて(バイナリになって)カセットに格納される。どうやって圧縮されたデータを扱うのか調べてみたら標準モジュールのgzipモジュールでできそうだったため、メモしておく 圧縮にはgzip.compress()メソッド。展開に…

mypyとjedi-vimで補完を強くする - Vim

Pythonで型アノテーションを使いたくなって、どうせならVimでも補完できるようにしたいと思って、やってみた Python3が有効になっているか確認 まずはVimでPython3が有効になっているか確認する もし有効になっていない場合、ここを参考にして、有効にする $…

GETリクエストのパラメータの空白はそのままでいい requests - Python

requests.get()でGETリクエストを送信するときのパラメータに空白が入るときはどうすればいいのかわからなかったが、そのまま渡していいことがわかった import requests params = {'aaa': '111 あああ', 'bbb': '222 いいい'} res = requests.get('http://go…

requests.apiモジュール - Python

https://github.com/requests/requests/blob/00fd4c8eb4ac0fd7b8f8d76bbf15ab06351c052c/requests/api.py#L16-L58 から重要なところを引っ張ってきた def request(method, url, **kwargs): with sessions.Session() as session: return session.request(meth…

実行しているPythonのバージョンを取得 - Python

いくつかの方法があるらしい sys.hexversionを使う platform.python_version_tuple()を使う 1.sys.hexversionを使う これはPyGithubのソースを見てたときに見つけて一人で感動した書き方 sys.hexversionを使うことでPythonのバージョンの16進数を取得できる…

pydubを使って音楽を鳴らす - Python

Pythonで音楽(mp3)を鳴らすにはpydubというライブラリを使えば実現できる。 github.com 音楽鳴らすまでに行ったことはここに書いてある 音を鳴らす · Issue #2 · tamago324/CasNewCommentNoticePy 環境 $ sw_vers ProductName: Mac OS X ProductVersion: 10.…

正規表現使った置換 - Python

Python正規表現を使った置換 reモジュールのsub()メソッドを使った >>> import re >>> re.sub(r'aa', 'bb', 'aabbccdd') 'bbbbccdd' 検索する文字列はr'対象'という感じで書かないといけないことに注意する 参考文献 Pythonで文字列を置換する:replace(), r…

辞書からJSON形式へ変換 - Python

辞書型からJSON形式のデータに変換するときにはjson.dumps()を使う また、JSON形式のテキストデータになる!(JSONはテキストの形式だから当たり前か...) >>> import json >>> testDict = { ... 'one': 1, ... 'two': 2, ... } >>> json.dumps(testDict) '{"o…

jedi-vimインストール - Vimプラグイン

Pythonの補完を行えるjedi-vimを入れてみた。 VimのPython3が有効になっていない場合はここを参考に有効にする まずは、jediをインストールする。 $ pip3 install --user jedi インストールされていることを確認 $ pip3 list | grep jedi jedi 0.11.1 次に、…

レスポンスのHTTPステータスコードの確認 - requests

レスポンスのHTTPステータスコードの確認を行うにはstatus_codeプロパティを使う。 >>> import requests >>> res = requests.get('https://www.google.co.jp') >>> res.status_code 200 また、結果の確認で使えるようなコードもある requests.codes.okなど …

辞書の結合 - Python

辞書の結合にはupdate()を使う。結合された結果は戻り値ではなく、その辞書に結合されることに注意!!!(これではまってた...) >>> dict1 = {'name': 'tamago'} >>> dict1 {'name': 'tamago'} >>> dict2 = {'age': 100} >>> dict1.update(dict2) >>> dict…

CSSを外部ファイルに記述 - bottle

CSSみたいな静的ファイルをbottleで扱うときには、ルーティングを設定してあげる static_fileをインポートして、処理を記述する 以下のようなファイル構成だった場合 . ├── bottle.py ├── server.py ├── static │ └── css │ └── main.css └── views └── top.…

Cookieを使う - bottle

bottleでCookieを使う Cookieの保存:response.set_cookie Cookieの取得:request.get_cookie 署名をする(secretを設定する)ことで少しはセキュアになる Cookieの保存 response.set_cookie('userId', 'tamago', max_age=15552000) max_ageを設定しないと、ブ…

redirectする - bottle

bottleでリダイレクトをする方法 /abcにアクセスしたら、/defにリダイレクトしたい from bottle import route, run from bottle import redirect @route('/abc') def test1(): redirect('/def') @route('/def') def test2(): return 'defのページ' run(host=…

レスポンスからdictを取得- Python

忘れるので書いておく requestsのレスポンスからjson形式のdictを取得 import requests res = requests.get('exsample.com') res.json() res.json()はdictで取得できる

__init__.pyについて

Pythonでの__init__.pyについて調べてみた __init__.pyの役割 __init__.pyがあるディレクトリをパッケージとして扱えるようになる(Python3からは__init__.pyが無くてもパッケージとして認識されるようになった) 初期化処理を記述できる パッケージとして扱え…