83021


問題そのものは解決していますが、手探りでPythhon/Sphinx/Jinja2を使っていることもあり、この問題の解決はかなり迷走していました。そのため、これに関連する知識を補強することを考えています。よろしくお願いします。

■質問  
Jinja2で自作オブジェクトを「文字列」と認識させる方法は、以下の二つ

  * オブジェクトを渡すのは諦めて文字列を渡す。
  * unicodeクラスを継承したクラスを作る。

Q1: 後者についての説明、或いはこれを類推させる説明はドキュメントにありますか？

「あるとしたら、✕✕辺り」という対象範囲の推測でも喜びます。

■該当のテンプレート

sphinxの「genindex.html」を改良したのですのですが、そのテンプレートの追加部分です。

[code]

      5 {% macro kana_entry(kname) %}
      6   {%- if kname is string -%}
      7   {{ kname|e }}
      8   {%- else %}
      9   {%- for isruby, val in kname -%}
     10     {%- if isruby -%}
     11     <ruby><rb>{{ val[0]|e }}</rb><rp>（</rp>
     12     <rt>{{ val[1]|e }}</rt><rp>）<rp>
     13     </ruby>
     14     {%- else %}
     15     {{ val|e }}
     16     {%- endif %}
     17   {%- endfor %}
     18   {%- endif %}
     19 {% endmacro %}
    
[/code]

上記の「if kname is
string」ですが、自作クラスを「string」として判定させる場合は「unicode」クラスを継承されると上手く動きます。たまたま見つけた解決策なのですが、この「たまたま見つける」のケースを少なくしたいと考えています。

■ここまでの経緯  
1．unittestでテストケースを作りながら開発。  
2．テストには__eq__を使い、Jinja2へは__str__でデータを渡すことで、テスト時はデータ構造のチェックのみとする方法を採用。  
3．unittestにはパスするが、make htmlでエラーになる現象に悩まされる。→回避策を採用  
4．同じ自作クラスなのに想定通りに使えるクラスもある。これの気づいて条件の切り分け

3はあっさり書いていますが、問題のクラスは__iter__,
__next__も実装していたこともあり、なかなか「unicodeクラスの継承」に気付けませんでした。

以上


CC BY-SA 4.0
2021-10-11T22:20:17.967
83015
2021-10-13T11:29:04.263
48452
question
python3 sphinx
Jinja2で自作オブジェクトを「文字列」と判定させる方法について、ドキュメントのどこかに説明がありますか？


解決しました。

■unicodeクラス  
ソースの該当箇所を遡って見たら、strクラスを（恐らくpython2との互換性のためだと思いますが）unicodeとしていました。

■結論  
「文字列として扱わせたいならstrクラスを継承する」という、ドキュメントに載せるほどでもない当たり前のことでした。

■ソースコード  
site-packages/docutils/nodes.py


CC BY-SA 4.0
2021-10-12T01:37:27.353
83021
2021-10-13T11:29:04.263
2021-10-13T11:29:04.263
48452
48452
83015
answer