Pour en revenir a la seconde question
Je recherche comment realiser des controles de cohérence
- en valeur dans la définition d'une class.
- en type dans la définition d'une class.
Comme y implémenter de telle contrainte et peut on alors générer des erreurs bloquant le code dans son exécution en générant des erreurs de type dans le meme esprit que
Code:
1 2 3
| TypeError: can only concatenate str (not "int") to
str |
Dommage que cela ne fonctionne pas
Cas N°1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| # coding: utf-8
from dataclasses import dataclass
@dataclass
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
prenom : str = 'pol'
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
# Base Application
if __name__ == '__main__':
nouveau =InventoryItem('toto', 150.45 )
print(nouveau)
nouveau =InventoryItem('toto', 1050.75 , 45 )
print(nouveau) |
Pas de soucis à l'exécution
Cas N°2 Dommage lorsque l'on souhaite avoir une valeur par defaut sur le premier champ La c'est refusé
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| # coding: utf-8
from dataclasses import dataclass
@dataclass
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str ='maxi'
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
# Base Application
if __name__ == '__main__':
nouveau =InventoryItem('toto', 150.45 )
print(nouveau)
nouveau =InventoryItem('toto', 1050.75 , 45 )
print(nouveau) |
il semble que l'exemple N°2 ne soit pas accepter par la solution des décorateurs dataclasses
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Traceback (most recent call last):
File "ex2.py", line 4, in <module>
@dataclass
File "python37\lib\dataclasses.py", line 966, in dataclass
return wrap(_cls)
File "python37\lib\dataclasses.py", line 958, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
File "python37\lib\dataclasses.py", line 879, in _process_class
else 'self',
File "\python37\lib\dataclasses.py", line 466, in _init_fn
raise TypeError(f'non-default argument {f.name!r} '
TypeError: non-default argument 'unit_price' follows default argument |