pythonでサブクラスを定義するときにオプションを渡せるようにしてみる
そういえば、継承時にbase classの他にオプションを取る定義が書けるのわりと最初ビックリするけれどvalidなpythonのコード。
3.6なら__init_subclass__
のフックを使うのが楽かもしれない。
たとえば、以下の様なコードを書いてみる。
- 自身を継承したクラスをchildrenという変数に格納する
- 継承時にnameというオプションを与えた時にはかわりにその名前を格納する
3.6の場合
3.6以降の場合
class A: children = set() def __init_subclass__(cls, name=None): name = name or cls.__name__ cls.children.add(name) class B(A): pass class C(A, name="MaybeA"): pass print(A.children) # {'B', 'MaybeA'}
3.6以前の場合
メタクラスを使って対応することもできる。ただ自分自身を格納しないようにするのがちょっとトリッキー
class AMeta(type): def __new__(self, clsname, bases, attrs, name=None): instance = super().__new__(self, clsname, bases, attrs) if "children" not in instance.__dict__: instance.children.add(name or clsname) return instance class A(metaclass=AMeta): children = set() class B(A): pass class C(A, name="MaybeA"): pass print(A.children) # {'B', 'MaybeA'}
emacs上でmozcを使ったときにC-nとC-pで変換候補中の移動をできるようにする
emacs上での日本語入力にmozcを使うようにしてみた。macではなくlinux上での環境の話。
通常の設定では以下だけなのだけれど(mozcをビルド後に mozc_emacs_helper
が使えるようにしないとだめ)。
(require 'mozc) (set-language-environment 'japanese) (setq default-input-method 'japanese-mozc)
このままの場合には、変換候補中のカーソル移動は矢印キーに限定される。
個人的には、C-p
, C-n
はemacsのバッファ上の通常のカーソル移動ではなく、変換候補のリスト上の移動になってほしかった。
advice
なので以下のようなadviceを追加した。
(defun advice:mozc-key-event-with-ctrl-key--with-ctrl (r) (cond ((and (not (null (cdr r))) (eq (cadr r) 'control) (null (cddr r))) (case (car r) (102 r) ; C-f (98 r) ; C-b (110 '(down)) ; C-n (112 '(up)) ; C-p (t r) )) (t r))) (advice-add 'mozc-key-event-to-key-and-modifiers :filter-return 'advice:mozc-key-event-with-ctrl-key--with-ctrl) ;; (advice-remove 'mozc-key-event-to-key-and-modifiers 'mozc-key-event-with-ctrl-key)
最近は、advice.elではなくnadvice.elの方を使うっぽい。