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
24 changes: 24 additions & 0 deletions Homework9Descriptor/PracticeTasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

class Kilometers:

def __get__(self, instance, owner):
return instance.m/1000

def __set__(self, instance, value):
instance.m =value/1000


class Distance:
kilometers = Kilometers()

def __init__(self, m):
self.m = m


distance = Distance(1200)

print(distance.kilometers)
print(distance.m)

distance.m = 2200
print(distance.kilometers)
33 changes: 33 additions & 0 deletions Homework9Descriptor/Task1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Задача-1
# Реализовать дескриптор валидации для аттрибута email.
# Ваш дескриптор должен проверять формат email который вы пытаетесь назначить

import re


class EmailDescriptor:

def __init__(self, name="variable"):
self.name = name

def __get__(self, instance, owner):
return instance.name

def __set__(self, instance, value):
if re.fullmatch("[\.\w-]+@[\.\w-]+", value):
instance.name = value
else:
raise ValueError("it's not a valid email. Please, enter a valid email")



class MyClass:
email = EmailDescriptor()


my_class = MyClass()
# my_class.email = "valid-email@gmail.com"
# print(my_class.email)
# my_class.email = "novalidemail"


22 changes: 22 additions & 0 deletions Homework9Descriptor/Task2MetaClass.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Задача-2
# Реализовать синглтон метакласс(класс для создания классов синглтонов).


class Singleton(type):
_instances = {}

def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]


class MyClass(metaclass=Singleton):
pass


c = MyClass()
b = MyClass()
assert id(c) == id(b)
# print(id(c))
# print(id(b))
29 changes: 29 additions & 0 deletions Homework9Descriptor/Task3Descr2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Задача-3
# реализовать дескриптор IngegerField(), который будет хранить уникальные
# состояния для каждого класса где он объявлен


class IngegerField:
instances = {}

def __init__(self, value=None):
self.instances[self] = value

def __get__(self, instance, owner):
return self.instances[self, instance]

def __set__(self, instance, value):
self.instances[self, instance] = value


class Data:
number = IngegerField()


data_row = Data()
new_data_row = Data()

data_row.number = 5
new_data_row.number = 10

assert data_row.number != new_data_row.number
Empty file added Homework9Descriptor/__init__.py
Empty file.
2 changes: 2 additions & 0 deletions Lesson6FilesDecorators/DecoratorTask1.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Задача-3 - не обязательна к выполнению
# Написать декоратор который будет подавлять ошибки возникающие в теле вашей функции.

import functools

def suppress_err(func):
@functools.wraps(func)
def wrapper():
try:
func()
Expand Down
36 changes: 25 additions & 11 deletions Lesson8ContexMan/Task1.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,32 @@
#Создать объект менеджера контекста который будет переходить
# Создать объект менеджера контекста который будет переходить
# в папку которую он принимает на вход.
# Так же ваш объект должен принимать исключение которое он будет подавлять.
# Если флаг об исключении отсутствует, исключение должно быть поднято.
#


#Нужно написать класс, который будет собирать информацию о погоде в регионе.
# API вы найдете на https://darksky.net/.
# Вам нужно сделать запрос на один из API представленныx в документации.
# Ваша задача подумать над тем как будет устроен ваш класс,
# какие методы он будет включать, где и как вы будете
# конфигурировать API, хранить ключ, обрабатывать респонс
import os

import request

class WeatherClass(object):
pass
class ManageCont:
def __init__(self, path, excep, is_suppress=False):
self.path = path
self.saved_cwd = None # to save current dir
self.excep = excep
self.is_suppress = is_suppress

def __enter__(self):
self.saved_cwd = os.getcwd()
try:
os.chdir(self.path)
except FileNotFoundError:
print("Path '{}' is not correct.".format(self.path))

def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self.saved_cwd)
if exc_type is not None and issubclass(exc_type, self.excep):
return self.is_suppress


with ManageCont(path="/Users/stas/PycharmProjects/PythonHomeworkDombrovskyi/", excep=KeyError):
raise KeyError

32 changes: 32 additions & 0 deletions Lesson8ContexMan/Task2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#Задача -2
#Создать объект менеджера контекста который будет переходить
# в папку которую он принимает на вход.
# Так же ваш объект должен принимать исключение которое он будет подавлять.
# Если флаг об исключении отсутствует, исключение должно быть поднято.
# Описать задачу выше но уже с использованием @contexmanager

import os
import contextlib


@contextlib.contextmanager
def manage_cont(path, excep, is_suppress=False):
saved_cwd = os.getcwd()
try:
os.chdir(path)
yield {}
except excep:
print("Exception '{}' was raised".format(excep))

finally:
os.chdir(saved_cwd)
if is_suppress:
pass
else:
raise


with manage_cont(path="/Users/stas/PycharmProjects/PythonHomeworkDombrovskyi/", excep=KeyError,is_suppress=True) as mc:
raise KeyError


34 changes: 34 additions & 0 deletions Lesson8ContexMan/Task3_Time.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

# Задача -3
# Создать менеджер контекста который будет подсчитывать время выполняния блока инсрукций

import time
import os


class ManageCont:
def __init__(self, path, excep, is_suppress=False):
self.path = path
self.saved_cwd = None # to save current dir
self.excep = excep
self.is_suppress = is_suppress
self.start_time = 0

def __enter__(self):
self.start_time = time.time()
self.saved_cwd = os.getcwd()
try:
os.chdir(self.path)
except FileNotFoundError:
print("Path '{}' is not correct.".format(self.path))

def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self.saved_cwd)
print(time.time() - self.start_time)
if exc_type is not None and issubclass(exc_type, self.excep):
return self.is_suppress


with ManageCont(path="/Users/stas/PycharmProjects/PythonHomeworkDombrovskyi/", excep=KeyError, is_suppress=True):
raise KeyError

34 changes: 34 additions & 0 deletions Lesson8ContexMan/TaskExcOnPractice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#Определить свой класс Exception
# который будет записывать месседж ошибки в файл.
# Тоесть при возникновении ошибки
# вам нужно писать ее в файл а не выводить.
# Как пример вызова вашего функционала используйте пример ниже:

#try:
# some_func()
# except FormatError as exc:
# exc.logerror()


class SomeError(Exception):

def __init__(self, line, file):
# line, file - where is exception was happened
self.line = line
self.file = file

def write_log_to_file(self, logfile='file.txt'):
with open(logfile, 'a') as log_f:
log_f.write("Error at file {} in {}", self.file, self.line, file =log)


def test_func():
raise SomeError(40, "compas.txt")


try:
test_func()
except SomeError as exc:
exc.write_log_to_file()