diff --git a/Homework9Descriptor/PracticeTasks.py b/Homework9Descriptor/PracticeTasks.py new file mode 100644 index 0000000..1426cf3 --- /dev/null +++ b/Homework9Descriptor/PracticeTasks.py @@ -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) \ No newline at end of file diff --git a/Homework9Descriptor/Task1.py b/Homework9Descriptor/Task1.py new file mode 100644 index 0000000..805f423 --- /dev/null +++ b/Homework9Descriptor/Task1.py @@ -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" + + diff --git a/Homework9Descriptor/Task2MetaClass.py b/Homework9Descriptor/Task2MetaClass.py new file mode 100644 index 0000000..d4bc031 --- /dev/null +++ b/Homework9Descriptor/Task2MetaClass.py @@ -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)) diff --git a/Homework9Descriptor/Task3Descr2.py b/Homework9Descriptor/Task3Descr2.py new file mode 100644 index 0000000..14bee73 --- /dev/null +++ b/Homework9Descriptor/Task3Descr2.py @@ -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 diff --git a/Homework9Descriptor/__init__.py b/Homework9Descriptor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Lesson6FilesDecorators/DecoratorTask1.py b/Lesson6FilesDecorators/DecoratorTask1.py index 55d1161..e2cd18c 100644 --- a/Lesson6FilesDecorators/DecoratorTask1.py +++ b/Lesson6FilesDecorators/DecoratorTask1.py @@ -1,8 +1,10 @@ # Задача-3 - не обязательна к выполнению # Написать декоратор который будет подавлять ошибки возникающие в теле вашей функции. +import functools def suppress_err(func): + @functools.wraps(func) def wrapper(): try: func() diff --git a/Lesson8ContexMan/Task1.py b/Lesson8ContexMan/Task1.py index 86baec8..2e9e325 100644 --- a/Lesson8ContexMan/Task1.py +++ b/Lesson8ContexMan/Task1.py @@ -1,18 +1,32 @@ -#Создать объект менеджера контекста который будет переходить +# Создать объект менеджера контекста который будет переходить # в папку которую он принимает на вход. # Так же ваш объект должен принимать исключение которое он будет подавлять. # Если флаг об исключении отсутствует, исключение должно быть поднято. -# -#Нужно написать класс, который будет собирать информацию о погоде в регионе. -# API вы найдете на https://darksky.net/. -# Вам нужно сделать запрос на один из API представленныx в документации. -# Ваша задача подумать над тем как будет устроен ваш класс, -# какие методы он будет включать, где и как вы будете -# конфигурировать API, хранить ключ, обрабатывать респонс +import os -import request -class WeatherClass(object): - pass \ No newline at end of file +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 + diff --git a/Lesson8ContexMan/Task2.py b/Lesson8ContexMan/Task2.py new file mode 100644 index 0000000..78960de --- /dev/null +++ b/Lesson8ContexMan/Task2.py @@ -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 + + diff --git a/Lesson8ContexMan/Task3_Time.py b/Lesson8ContexMan/Task3_Time.py new file mode 100644 index 0000000..0163c6f --- /dev/null +++ b/Lesson8ContexMan/Task3_Time.py @@ -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 + diff --git a/Lesson8ContexMan/TaskExcOnPractice.py b/Lesson8ContexMan/TaskExcOnPractice.py new file mode 100644 index 0000000..e02220b --- /dev/null +++ b/Lesson8ContexMan/TaskExcOnPractice.py @@ -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() + +