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-nemacsのバッファ上の通常のカーソル移動ではなく、変換候補のリスト上の移動になってほしかった。

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の方を使うっぽい。