90531


# 環境

  * Python 3.10.2
  * pytest 7.1.2
  * mypy 0.971

# 背景

以下のクラスのテストコードを作成しています。

[code]

    import datetime
    import calendar
    
    
    class Month:
        def __init__(self, month: str):
            self._month = month
            dt_start_date = datetime.datetime.strptime(month + "-01", "%Y-%m-%d").date()
            _, last = calendar.monthrange(dt_start_date.year, dt_start_date.month)
            dt_end_date = dt_start_date.replace(day=last)
    
            self._dt_start_date = dt_start_date
            self._dt_end_date = dt_end_date
    
        @property
        def days(self) -> int:
            return (self._dt_end_date - self._dt_start_date).days
    
        @property
        def start_date(self) -> str:
            return str(self._dt_start_date)
    
        @property
        def end_date(self) -> str:
            return str(self._dt_end_date)
    
[/code]

テストコードは以下の通りです。  
毎回`Month`インスタンスを生成するコードを書くのが面倒なので、`Month`インスタンスを`setup_class`関数の中でインスタンス変数に設定しました。

[code]

    class TestMonth:
        @classmethod
        def setup_class(cls) -> None:
            cls.month_obj = Month("2022-08")
    
        def test_days(self) -> None:
            self.month_obj.days == 31
    
        def test_start_date(self) -> None:
            self.month_obj.days == "2022-08-01"
    
        def test_end_date(self) -> None:
            self.month_obj.days == "2022-08-31"
    
[/code]

# やりたいこと

テストコードもmypyチェックを通したいです。  
しかし、以下のエラーが発生しました。

[code]

    $ mypy --strict test_month.py 
    error: "Type[TestMonth]" has no attribute "month_obj"
    error: "TestMonth" has no attribute "month_obj"
    error: "TestMonth" has no attribute "month_obj"
    error: "TestMonth" has no attribute "month_obj"
    Found 4 errors in 1 file (checked 1 source file)
    
[/code]

`--strict`を指定しなければエラーは発生しませんが、できれば`--strict`を指定してmypyを実行したいです。

# 質問

mypyチェックを通すには、テストコードをどのように変更するのがよいでしょうか？  
そもそもクラスメソッドである`setup_class`関数の中で、`TestMonth`のインスタンス変数を設定してはいけないのでしょうか？


CC BY-SA 4.0
2022-08-12T18:05:15.210
90530
2022-08-12T22:10:39.577
19524
question
python mypy pytest
pytestの`setup_class`関数の中でインスタンス変数を設定しようとすると、mypyエラーが発生します。どのように修正すればよいでしょうか？


次のように `month_obj` の宣言を追加すればmypyを通せるのではないでしょうか。

[code]

    class TestMonth:
        month_obj: Month
    
        ...
    
[/code]


CC BY-SA 4.0
2022-08-12T22:10:39.577
90531
2022-08-12T22:10:39.577
9464
90530
answer