85262


現状、実害はないのですが気になるので何かご存知であれば宜しくお願いします。

### 現象

編集後の初回のpytestだけwarningが発生する

### 質問

初回のみ発生する理屈は何でしょうか。

### エラー内容

「=」は多いので少し削りました。

[code]

    …
    ===================== warnings summary =========================================
    src/__init__.py:47
      /path/to/the/directory/src/__init__.py:47: DeprecationWarning: invalid escape sequence \|
        """かな|単語^オプション」を取り出す正規表現を作る.
    
    -- Docs: https://docs.pytest.org/en/stable/warnings.html
    ============== 59 passed, 1 warning in 5.03s ===================================
    
[/code]

### warning発生箇所の抜粋

[code]

     45
     46 def parser_for_kana_text(separator, option_marker):
     47     """かな|単語^オプション」を取り出す正規表現を作る.
     48
     49     :param separator: 「かな」と「単語」を分ける文字の指定.
     50     :type separator: str
     51     :param option_marker: 「^オプション」の開始文字の指定.
     52     :type option_marker: str
     53     :return: 「かな|単語^オプション」を取り出す正規表現.
     54     :rtype: 正規表現.
     55
     56     doctest::
     57
     58        >>> parser_for_kana_text(r'\|', r'\^')
     59        re.compile('([ \\u3000]*)((.*?)\\\\|)*([^\\\\^]*)((\\\\^)([0-9a-z]*)?)?')
     60     """
     61
    
[/code]

### 考察

エラーメッセージを調べて、「re.comple…」の箇所の「|」の前にある大量の「\」で警告が発生していることは理解してます。ただ、ここは直前の「>>>
parser_for_kana_text」が返す文字列そのままなので如何ともし難く。。

そういう事情もあって「編集後の初回のみ警告」だろうととは想像していますが、この理解であっているか気になっています。


CC BY-SA 4.0
2021-11-17T10:29:49.573
83679
2022-08-19T01:46:57.463
2022-08-19T01:46:57.463
3060
48452
question
python python3 pytest
編集後の初回のpytestだけwarningが発生する


> 編集後の初回のみ警告

これはpycキャッシュが作成されているためです。  
t.py というファイルに提示されたコードを貼り付けて実行してみました（WindowsですがLinux等でも原理は同じです）。

[code]

    > python3 -Wall -c "import t"
    t.py:2: DeprecationWarning: invalid escape sequence '\|'
      """かな|単語^オプション」を取り出す正規表現を作る.
    
    > python3 -Wall -c "import t"
    
[/code]

このように2回目以降は警告が出ません。  
しかしpycキャッシュを削除したり、pyを更新すればまた表示されます。

[code]

    > del __pycache__\t.cpython-310.pyc
    
    > python3 -Wall -c "import t"
    t.py:2: DeprecationWarning: invalid escape sequence '\|'
      """かな|単語^オプション」を取り出す正規表現を作る.
    
[/code]

* * *

警告が出る問題については、docstringをrawにすれば良さそうです。

修正コード（docstring前に `r` を付け、 `re.compile` の行のエスケープを削減）

[code]

    def parser_for_kana_text(separator, option_marker):
        r"""かな|単語^オプション」を取り出す正規表現を作る.
    
        :param separator: 「かな」と「単語」を分ける文字の指定.
        :type separator: str
        :param option_marker: 「^オプション」の開始文字の指定.
        :type option_marker: str
        :return: 「かな|単語^オプション」を取り出す正規表現.
        :rtype: 正規表現.
    
        doctest::
    
           >>> parser_for_kana_text(r'\|', r'\^')
           re.compile('([ \u3000]*)((.*?)\\|)*([^\\^]*)((\\^)([0-9a-z]*)?)?')
        """
    
[/code]


CC BY-SA 4.0
2021-12-21T21:10:29.410
85262
2021-12-21T21:10:29.410
806
83679
answer