74521


Pythonのdataclassにおいて、属性のバリデーションを実施したいときはどう書けばよいのでしょうか？  
具体的には、下記のコードでnameに空文字が入るのを防ぎたいです。  
Python 3.9.2です。

[code]

    from dataclasses import dataclass
    
    @dataclass(frozen=True)
    class UserName:
        name: str
    
    userName1 = UserName("") # エラーにしたい
    
    
[/code]


CC BY-SA 4.0
2021-03-08T09:40:16.600
74519
2021-03-08T11:02:48.477
19297
question
python python3
Pythonのdataclassで値のバリデーションをする方法


[PEP 557: Data Classes post-init-
processing](https://www.python.org/dev/peps/pep-0557/#post-init-processing)
を使う方法があります。

**validate_name.py**

[code]

    from dataclasses import dataclass
    
    @dataclass(frozen=True)
    class UserName:
      name: str
    
      def __post_init__(self):
        if not self.name:
          raise ValueError('user name is empty string')
    
    if __name__ == '__main__':
      userName1 = UserName("") # エラーにしたい
    
[/code]

**実行結果**

[code]

    $ python3 validate_name.py
    Traceback (most recent call last):
      File "validate_name.py", line 13, in <module>
        userName1 = UserName("") # エラーにしたい
      File "<string>", line 4, in __init__
      File "validate_name.py", line 10, in __post_init__
        raise ValueError('user name is empty string')
    ValueError: user name is empty string
    
[/code]


CC BY-SA 4.0
2021-03-08T11:02:48.477
74521
2021-03-08T11:02:48.477
74519
answer