hnc-artur/HNS/json/main.py

99 lines
2.2 KiB
Python

import json
import random
from Shape import Shape
from Circle import Circle
from Rectangle import Rectangle
from Square import Square
from Enums import ShapeType
from Enums import ShapeColor
def safe_read(obj, property, default_value):
if property in obj:
return obj[property]
return default_value
def create_shape(json):
if 'type' in json:
shape_type_raw = json['type']
shape_type = ShapeType.from_string(shape_type_raw)
if shape_type == ShapeType.Circle:
radius = safe_read(json, 'radius', 0)
obj = Circle(radius)
elif shape_type == ShapeType.Square:
side = safe_read(json, 'side', 0)
obj = Square(side)
elif shape_type == ShapeType.Rectangle:
width = safe_read(json, 'width', 0)
height = safe_read(json, 'height', 0)
obj = Rectangle(width, height)
else:
raise TypeError(f'Неизвестная фигура {shape_type_raw}')
obj.color = ShapeColor.from_string(safe_read(json, 'color', 'unknown'))
return obj
def generate_shape():
types = list(ShapeType)
rnd = random.randint(1, len(types) - 1)
shape_type = types[rnd]
if shape_type == ShapeType.Circle:
obj = Circle(rnd)
elif shape_type == ShapeType.Square:
obj = Square(rnd)
elif shape_type == ShapeType.Rectangle:
obj = Rectangle(rnd, rnd)
else:
raise TypeError(f'Происходит что-то непонятное')
obj.color = ShapeColor.Unknown
return obj
def json_to_python(filename):
data_list = []
with open(filename) as lines:
data = json.load(lines)
for i in data['shapes']:
sh1 = create_shape(i)
data_list.append(sh1)
return data_list
def python_to_json(data, filename):
with open(filename, 'w') as f:
json.dump({'shapes': data}, f, default=Shape.convert_to_json)
def filter_shapes(data, area):
return [shape for shape in data if shape.area() >= area]
shape_list = json_to_python('shapes.json')
shape_list = filter_shapes(shape_list, 20)
shape_list.append(generate_shape())
python_to_json(shape_list, 'shapes.json')