83244


自己回答で詳細を説明していますが、このエラーが `__init__`
に対するものだと気付けば、エラー情報から特定できるソースの該当箇所を見ることで`add_node`の正しい書き方が分かります。

### 環境

  * windows10/cygwin64
  * python3.8
  * sphinx4.3.0+（開発版）

### エラー内容

[code]

    Exception occurred:
      File "/usr/local/lib/python3.8/site-packages/docutils/parsers/rst/states.py", line 886, in interpreted
        nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
    TypeError: ExRole() takes no arguments
    
[/code]

### エラーの出るロールの内容

[code]

    856
    857 class ExRole(docutils.SphinxRole):
    858     """「:kana:`かな|単語`」によるルビ表示"""
    859
    860     def run(self):
    861         node = KanaText(self.text)
    862         return [node], []
    863
    
[/code]


CC BY-SA 4.0
2021-10-25T05:52:33.497
83243
2021-10-25T15:59:48.557
2021-10-25T15:59:48.557
48452
48452
question
python3 sphinx
ロールの定義を関数からクラスに変えると、「make html」実行時に「TypeError: … takes no arguments」というエラーが発生する


### 原因

setup内でのadd_roleの記述ミス

正しいコード

[code]

    929
    930     #「:kana:`かな|単語^11`」が使用可能になる
    931     app.add_role('kana', ExRole())
    932
    
[/code]

間違っているコード（ExRoleに注目）

[code]

    929
    930     #「:kana:`かな|単語^11`」が使用可能になる
    931     app.add_role('kana', ExRole)
    932
    
[/code]

### 状況と考察

状況

  * 参考にしたsphinx拡張は関数型ロールを使っていて、そのまま関数型で使う分には問題なかった。  
これをクラスにしようと変更したら「TypeError」エラーが発生。

考察

  * 関数型からクラス型に変えるのに、同じadd_roleを使って登録することに引っかかるものはあったが、「いい感じにしてくれるはず」と根拠のない解釈をしていた。
  * エラーから該当のソースを見て `__call__` は目にしていたが、関数型との引数の違いに注目していて `__call__` が使われている意図を見逃していた。

### 参考

SphinxRoleクラス

[code]

    346
    347 class SphinxRole:
    …
    364
    365     def __call__(self, name: str, rawtext: str, text: str, lineno: int,
    366                  inliner: Inliner, options: Dict = {}, content: List[str] = []
    367                  ) -> Tuple[List[Node], List[system_message]]:
    …
    385         return self.run()
    386
    …
    
[/code]

add_roleの引数にインスタンス化する前のクラスを渡すと `__init__` が呼び出されれてエラーになる。  
インスタンス化した後のオブジェクトが、元の関数型と同等になる。


CC BY-SA 4.0
2021-10-25T05:52:33.497
83244
2021-10-25T05:52:33.497
48452
83243
answer