Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions final_project_1-3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""
1. Реализовать класс «Дата», функция-конструктор которого должна принимать дату в виде
строки формата «день-месяц-год». В рамках класса реализовать два метода. Первый,
с декоратором @classmethod. Он должен извлекать число, месяц, год и преобразовывать их
тип к типу «Число». Второй, с декоратором @staticmethod, должен проводить валидацию числа,
месяца и года (например, месяц — от 1 до 12). Проверить работу полученной структуры на
реальных данных.
"""

class Date:
def __init__(self, date):
self.date = date

@classmethod
def date_to_int(cls, date):
date_int = list(map(int, date.split('-')))
return date_int

@staticmethod
def check_input(date_input):
date_int = list(map(int, date_input.split('-')))
if date_int[0] > 31:
print('неверно введено число')
elif date_int[1] > 12:
print('неверно введен месяц')
elif len(date_int) != 3:
print('неверный формат даты. введите в формате «день-месяц-год»')
else:
print('дата введена корректно')
return date_input


date_value = Date('34-12-2202')

print(Date.date_to_int('11-12-2202'))

print(Date.check_input('31-12-2202-5'))

print('------------------------------------------------------------------------------------------')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

выполнено


"""2. Создайте собственный класс-исключение, обрабатывающий ситуацию деления на ноль. Проверьте
его работу на данных, вводимых пользователем. При вводе нуля в качестве делителя программа должна
корректно обработать эту ситуацию и не завершиться с ошибкой.
"""

class self_exception(Exception):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

self_exception
нарушение пеп-8 в именах классов

def __init__(self, error_text):
self.error_txt = error_text

input_num = input('введите число: ')

try:
input_num = int(input_num)
if input_num == 0:
raise self_exception('делить на "0" нельзя!')
except ValueError:
print('не число!')
except self_exception as err:
print(err)
else:
print('деление возможно')


print('------------------------------------------------------------------------------------------')

"""3. Создайте собственный класс-исключение, который должен проверять содержимое списка на наличие
только чисел. Проверить работу исключения на реальном примере. Запрашивать у пользователя данные и
заполнять список необходимо только числами. Класс-исключение должен контролировать типы данных
элементов списка.
Примечание: длина списка не фиксирована. Элементы запрашиваются бесконечно, пока пользователь сам не
остановит работу скрипта, введя, например, команду «stop». При этом скрипт завершается, сформированный
список с числами выводится на экран.
"""


class stop_exception(Exception):
def __init__(self, stop_text):
self.error_txt = stop_text

new_array = []
marker = True
while True:
try:
new_elem = input('введите число. для прекращения ввода "stop" :')
if new_elem == 'stop':
raise stop_exception('введено стоп-слово')
new_array.append(int(new_elem))
except ValueError:
print('не число!')
except stop_exception as err:
print(err)
break
print(new_array)

print('------------------------------------------------------------------------------------------')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stop_exception
также




223 changes: 223 additions & 0 deletions final_project_4-6.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
"""4. Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. А также класс
«Оргтехника», который будет базовым для классов-наследников. Эти классы — конкретные типы оргтехники
(принтер, сканер, ксерокс). В базовом классе определите параметры, общие для приведённых типов.
В классах-наследниках реализуйте параметры, уникальные для каждого типа оргтехники.
5. Продолжить работу над первым заданием. Разработайте методы, которые отвечают за приём
оргтехники на склад и передачу в определённое подразделение компании. Для хранения данных
о наименовании и количестве единиц оргтехники, а также других данных, можно использовать любую
подходящую структуру (например, словарь).
6. Продолжить работу над вторым заданием. Реализуйте механизм валидации вводимых пользователем данных.
Например, для указания количества принтеров, отправленных на склад, нельзя использовать строковый тип
данных.
"""

import os
import sys
#from math import ceil
from sys import exit


class Warehouse:
def __init__(self, capacity, address, warm_storage):
self.capacity = capacity # рабочий объем склада в паллетах
self.address = address # адрес склада
self.warm_storage = warm_storage # является ли теплым (True/False)

"""метод добавления склада как площадки, на которую будут поставятся грузы
в папке с названием склада добавляется текстовый файл с его характеристиками
при существлении погрузки в конце дня в характеристиках склада изменяется
доступный объем хранения"""

def add_warehouse(self): # добавляем склад для проведения операция с ним
path = str(f'{self.address}') # создаем директорию по адресу склада в корневой папке проекта
try:
os.makedirs(path)
except OSError:
print("Создать директорию %s не удалось, возможно, она уже существует" % path)
else:
print("Успешно создана директория %s " % path)

with open(f'{path}/warehouse_spec.txt', 'w') as file:
file.write(f'{self.capacity},{self.address},{self.warm_storage}')

"""метод производит поставку на склад. вызывается в коце дня, когда сформированы все запросы
на доставку на этот склад"""

def upload_warehouse(self, upload_date):
path = str(f'{self.address}/{upload_date}')
with open(f'{self.address}/warehouse_spec.txt', 'r+') as file_4: # достаем из спецификации актуальную
# емкость склада
for line in file_4:
spec_last = line #добираемся до последней строки
new_capacity = spec_last.split(',', 1)
new_capacity = int(new_capacity[0])
print(f'актуальая емкость склада {new_capacity}')

files = f'full_pall.txt', f'remain_pall.txt' # создаем кортеж для перебора файлов
for file in files: # перебираем строки в обоих файлах
with open(f'{self.address}/storage.txt', 'a') as file_2: # файл отображающий товары на складе
with open(f'{path}/{file}', 'r') as file_3:
for line in file_3:
file_2.write(line)
line = line.split(',', 1)
line = int(line[0])
new_capacity = new_capacity - line
os.rename(f'{path}/{file}', # переименовываем отработаные файлы
f'{path}/uploaded_{file}')
print(f'конечная емкость склада после отгрузки {new_capacity}')
file_4.write(f'\n{new_capacity},{self.address},{self.warm_storage},{upload_date}')


"""метод производит поставку на склад. вызывается в коце дня, когда сформированы все запросы
на доставку на этот склад"""


def download_warehouse(self, vendor, model):
with open(f'{self.address}/storage.txt', 'r') as file_5: #открываем файл отображающий товары на складе
count = False
for line in file_5:
line = line.split(',')
storage_vendor = line[3] #вытягиваем из списка производителя
storage_model = line[4] #вытягиваем из списка модель
if vendor == storage_vendor and model == storage_model:
count = True #переменная, свидетельствующая о наличии товара на складе
if count == True:
print(f'поставка со склада {self.address} модели {vendor} {model} возможна')
else:
print(f'на складе {self.address} нет необходимого товара')


class MyExc(Exception):
def __init__(self, txt):
self.txt = txt


class OfficeEquipment:
def __init__(self, type, supplier, origin_country, vendor, model, pallett_quantity, mass,
warm_storage=True):
self.type = type # тип оргтехники
self.supplier = supplier # продавец
self.origin_country = origin_country # страна происхождения
self.vendor = vendor # производитель
self.model = model # модель

try:
if isinstance(pallett_quantity, int):
self.pallett_quantity = pallett_quantity # количество единиц на паллете, шт.
else:
raise MyExc("количество товаров на паллете должно быть целым числом")
except MyExc as error:
print(error.txt)
sys.exit(0)

self.mass = mass # масса брутто единицы, кг


class Printers(OfficeEquipment):
def __init__(self, supplier, origin_country, vendor, model, pallett_quantity,
mass, laser, colors, warm_storage):
super().__init__(supplier, origin_country, warm_storage, vendor, model, pallett_quantity, mass)
self.laser = laser # является ли лазерным (True/False)
self.colors = colors # количество цветов кроме черного "0" - черно-белый

def shipment(self, shipment_quantity, shipment_address, shipment_date):
path = str(f'{shipment_address}/{shipment_date}') # создаем директорию по адресу склада в корневой
try: # папке проекта и директорию по дате поставки
os.makedirs(path) # в папке склада
except OSError:
print("Создать директорию %s не удалось, возможно, она уже существует" % path)
else:
print("Успешно создана директория %s " % path)

pallet_num = shipment_quantity // self.pallett_quantity # определяем количество
# целых паллетов
print(f'количество целых паллетов {pallet_num}')
shipment_remains = shipment_quantity % self.pallett_quantity \
/ self.pallett_quantity # определяем остаток места в долях от
# целого палета
print(f'остаток груза в долях от целого палета {shipment_remains}')
quantity_remain = int(shipment_remains * self.pallett_quantity) # остаток для
# отгрузки в штуках
print(f'остаток в штуках {quantity_remain}')

file = open(f'{path}/full_pall.txt', 'a') # создаем файл, в который будем записывать целые палеты
file.write(f'{pallet_num},{self.supplier},{self.origin_country},{self.vendor},'
f'{self.model},{self.pallett_quantity},{self.mass},'
f'{self.pallett_quantity}\n') # записываем строку с целыми палетами текущей поставки
file.close()

file = open(f'{path}/remain_pall.txt', 'a+') # создаем файл, в который будем записывать
# остатки с палеты, или дописываем его
if os.stat(f'{path}/remain_pall.txt').st_size != 0: # проверяем пустой файл или нет
print('file is not empty')
with open(f'{path}/remain_pall.txt', 'r') as file_1: # считываем последнюю строку
for line in file_1:
row = line
print(type(row))
print(f'последняя строка в остатках {row}')
last_remain = row.split(',', 2) # разбиваем строку по запятым до листа
print(last_remain)
last_remain = float(last_remain[1]) # берем первое значение из листа - степень заполненности паллета
print(f'палет заполнен на {last_remain}')
print(type(last_remain))

add = int((1 - last_remain) * self.pallett_quantity) # проверяем, сколько единиц товара
# можно доложить в неполный паллет
print(f'можно доложить {add} шт.')
if add > quantity_remain:
print('пустого места больше чем остаток отгрузки')
last_remain = last_remain + quantity_remain / self.pallett_quantity # добавляем в паллет
# остаток товара отгрузки
print(f'теперь палет заполнен на {last_remain}')
file.write(f'0,{(last_remain)},{self.supplier},{self.origin_country},'
f'{self.vendor},{self.model},{self.pallett_quantity},{self.mass},'
f'{quantity_remain}\n') # вписываем то, что догружаем в неполный паллет
else:
print('пустого места меньшее чем остаток отгрузки')
last_remain = last_remain + add / self.pallett_quantity
print(f'теперь заполненность палета{last_remain}')
file.write(f'0,{last_remain / self.pallett_quantity},{self.supplier},{self.origin_country},'
f'{self.vendor},{self.model},{self.pallett_quantity},{self.mass},'
f'{add}\n') # вписываем то, что догружаемв неполный паллет
quantity_remain = quantity_remain - add # вычисляем количество шт. к отгрузке
print(f'теперь остаок отгрузки {quantity_remain} шт.')
file.write(f'1,{quantity_remain / self.pallett_quantity},{self.supplier},{self.origin_country},'
f'{self.vendor},{self.model},{self.pallett_quantity},{self.mass},'
f'{quantity_remain}\n') # вписываем строку с новым недозаполненым паллетом
else:
print('file is empty')
file.write(f'1,{shipment_remains},{self.supplier},{self.origin_country},{self.vendor},{self.model},'
f'{self.pallett_quantity},{self.mass},{quantity_remain}\n') # вписываем строку
# остаток от текущей поставки
file.close()


class Monitors(OfficeEquipment):
def __init__(self, supplier, origin_country, warm_storage, vendor, model, pallett_quantity,
mass, is_flat, diagonal):
super().__init__(supplier, origin_country, warm_storage, vendor, model, pallett_quantity, mass)
self.is_flat = is_flat # является ли жидкокриталличским (True/False)
self.diagonal = diagonal # диагональ экрана в дюймах


class phone(OfficeEquipment):
def __init__(self, supplier, origin_country, warm_storage, vendor, model, pallett_quantity,
mass, line_num, is_ip, is_wire):
super().__init__(supplier, origin_country, warm_storage, vendor, model, pallett_quantity,
mass)
self.line_num = line_num # количество линий
self.is_ip = is_ip # является ли IP-телефоном
self.is_wire = is_wire # является ли проводным


hp3322 = Printers('Print Ltd', 'China', 'HP', '3322', 35, 16.3, True, False, True) #определяем экземпляр с товаром

hp3322.shipment(5896, "BCN_Sants", '05.01.2023') #составляем заявку для поставки на склад

bcn_sants = Warehouse(1700, 'BCN_Sants', True) #создаем склад

bcn_sants.add_warehouse() #добавляем данные о складе

bcn_sants.upload_warehouse('05.01.2023') #осуществляем поставку на склад

bcn_sants.download_warehouse('HP', '3322') #проверяем возможность отгрузки со склада

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

выполнено