-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
431 lines (327 loc) · 10.5 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * (self.radius ** 2)
class Rectangle(Shape):
def __init__(self, largeur, hauteur):
self.largeur = largeur
self.hauteur = hauteur
def area(self):
return self.largeur * self.hauteur
circle = Circle(5)
assert round(circle.area(), 2) == 78.54
rectangle = Rectangle(3, 4)
assert rectangle.area() == 12
class BankAccount:
def __init__(self, balance):
assert balance > 0, "Le compte doit avoir de l'argent"
self.balance = balance
def __add__(self, montant):
self.balance += montant
return self
def __sub__(self, montant):
self.balance -= montant
return self
def __str__(self):
return f"Le solde du compte est de {self.balance} euros"
account = BankAccount(100)
account += 20
assert account.balance == 120
account -= 50
assert account.balance == 70
def check_positive(func):
def wrapper(x):
if x < 0:
raise ValueError("x doit être positif")
return func(x)
return wrapper
@check_positive
def double(x):
return x * 2
assert double(5) == 10
try:
double(-1)
except ValueError:
print("Exception levée correctement")
class Car:
def __init__(self):
self._speed = 0
@property
def speed(self):
return self._speed
@speed.setter
def speed(self, value):
if value <= 0:
raise ValueError("La vitesse doit être positive")
if value > 200:
raise ValueError("La vitesse doit être inférieure ou égale à 200")
self._speed = value
# Exemple de test
car = Car()
car.speed = 120
assert car.speed == 120
try:
car.speed = 250 # Doit lever une exception
except ValueError:
print("Vitesse non valide")
class InvalidAgeError(Exception):
pass
class Person:
def __init__(self, prenom,age):
if age > 150:
raise InvalidAgeError("L'âge doit être inférieur à 150")
elif age < 0:
raise InvalidAgeError("L'âge doit être positif")
try:
person = Person("John", 200)
except InvalidAgeError:
print("Age non valide")
class DatabaseConnection:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(DatabaseConnection, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self):
if not hasattr(self, 'initialized'):
self.data = {}
self.initialized = True
def create_context(self): #
return DatabaseContext(self)
class DatabaseContext:
def __init__(self, db_connection):
self.db_connection = db_connection
self.operations = []
def add_entry(self, entry_id, data):
self.db_connection.data[entry_id] = data
def delete_entry(self, entry_id):
if entry_id in self.db_connection.data:
del self.db_connection.data[entry_id]
def drop_all(self):
self.db_connection.data.clear()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
db = DatabaseConnection()
with db.create_context() as based:
based.add_entry(1, "data1")
based.add_entry(2, "data2")
based.delete_entry(1)
assert db.data == {2: 'data2'}
with db.create_context() as based:
based.drop_all()
assert db.data == {}
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
class Rectangle(Shape):
def __init__(self, largeur, hauteur):
self.largeur = largeur
self.hauteur = hauteur
def area(self):
return self.largeur * self.hauteur
class ShapeFactory:
@staticmethod
def create(shape_type, **kwargs):
if shape_type == "circle":
return Circle(kwargs['radius'])
elif shape_type == "rectangle":
print("We do red rectangle now ?")
return Rectangle(kwargs['largeur'], kwargs['hauteur'])
else:
raise ValueError("Connais pas ton truc géométrique, reviens avec des cercles ou des rectangles")
# Example test
shape1 = ShapeFactory.create(shape_type="circle", radius=5)
assert isinstance(shape1, Circle)
assert round(shape1.area(), 2) == 78.54
shape2 = ShapeFactory.create(shape_type="rectangle", largeur=3, hauteur=4)
assert isinstance(shape2, Rectangle)
assert shape2.area() == 12
import threading
import time
from functools import wraps
class TimeoutError(Exception):
"""Exception levée lorsque la limite de temps est dépassée."""
pass
def timeout_limit(timeout, raise_exception=False):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# Variable pour stocker l'exception
result = [None]
exc = [None]
# Fonction interne exécutée dans un thread séparé
def target():
try:
result[0] = func(*args, **kwargs)
except Exception as e:
exc[0] = e
# Démarrage du thread pour exécuter la fonction
thread = threading.Thread(target=target)
thread.start()
# Attente pendant la durée spécifiée
thread.join(timeout)
# Si le thread est toujours actif après le timeout
if thread.is_alive():
if raise_exception:
raise TimeoutError("Exécution interrompue par raise_exception.")
else:
raise TimeoutError("La limite de temps a été dépassée.")
# Si une exception a été levée dans le thread, la relancer
if exc[0]:
raise exc[0]
return result[0]
return wrapper
return decorator
# Exemple d'utilisation :
@timeout_limit(5, raise_exception=False)
def long_task():
print("Tâche longue démarrée")
time.sleep(10) # Simuler une tâche longue
print("Tâche longue terminée")
try:
long_task()
except TimeoutError as e:
print(e)
class Matrix:
def __init__(self, data):
# Vérification que chaque ligne a la même longueur
if not all(len(row) == len(data[0]) for row in data):
raise ValueError("Toutes les lignes doivent avoir la même longueur.")
self.values = data # Changer data à values
def __add__(self, other):
if len(self.values) != len(other.values) or len(self.values[0]) != len(other.values[0]):
raise ValueError("Les matrices doivent avoir les mêmes dimensions pour l'addition.")
# Addition des matrices
result = [
[
self.values[i][j] + other.values[i][j]
for j in range(len(self.values[0]))
]
for i in range(len(self.values))
]
return Matrix(result)
def __mul__(self, other):
if len(self.values[0]) != len(other.values):
raise ValueError("Le nombre de colonnes de la première matrice doit être égal au nombre de lignes de la deuxième.")
# Multiplication des matrices
result = [
[
sum(self.values[i][k] * other.values[k][j] for k in range(len(other.values)))
for j in range(len(other.values[0]))
]
for i in range(len(self.values))
]
return Matrix(result)
from abc import ABC, abstractmethod
class Animal(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof"
class Cat(Animal):
def speak(self):
return "Meow"
class AnimalFactory:
@staticmethod
def create(animal_type, name):
if animal_type == "dog":
return Dog(name)
elif animal_type == "cat":
return Cat(name)
else:
raise ValueError("Autre chose qu'une créature d'australie stp")
dog = AnimalFactory.create(animal_type="dog", name="Buddy")
assert isinstance(dog, Dog)
assert dog.speak() == "Woof"
cat = AnimalFactory.create(animal_type="cat", name="Misty")
assert isinstance(cat, Cat)
assert cat.speak() == "Meow"
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def __eq__(self, other):
return self.price == other.price
def __lt__(self, other):
return self.price < other.price
def __le__(self, other):
return self.price <= other.price
def __gt__(self, other):
return self.price > other.price
def __ge__(self, other):
return self.price >= other.price
def __ne__(self, other):
return self.price != other.price
product1 = Product("Apple", 1.50)
product2 = Product("Banana", 1.20)
assert product1 > product2
class Account:
def __init__(self):
self._balance = 0
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, amount):
if amount < 0:
raise ValueError("Le dépôt ne peut pas être inférieur à 0.")
self._balance = amount
def deposit(self, amount):
if amount < 0:
raise ValueError("Le dépôt ne peut pas être inférieur à 0.")
self._balance += amount
def withdraw(self, amount):
if self._balance - amount < 0:
raise ValueError("Solde insuffisant.")
self._balance -= amount
account = Account()
account.balance = 100
try:
account.withdraw(150) # Doit lever une exception
except ValueError:
print("Solde insuffisant")
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __add__(self, other):
if isinstance(other, Vector):
return Vector(self.x + other.x, self.y + other.y)
return NotImplemented
def __sub__(self, other):
if isinstance(other, Vector):
return Vector(self.x - other.x, self.y - other.y)
return NotImplemented
def __mul__(self, scalar):
if isinstance(scalar, (int, float)):
return Vector(self.x * scalar, self.y * scalar)
return NotImplemented
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
assert v3.x == 4 and v3.y == 6
v4 = v1 * 2
assert v4.x == 2 and v4.y == 4