Ver Fonte

Minor refactoring: added comments, enforced DRY

Vsevolod Levitan há 1 ano atrás
pai
commit
3b8000821a
2 ficheiros alterados com 45 adições e 31 exclusões
  1. 33 30
      src/settings.py
  2. 12 1
      src/settings_manager.py

+ 33 - 30
src/settings.py

@@ -8,6 +8,31 @@ class settings:
     __corresp_account_id = 0
     __property_name = ""
     __property_type = ""
+
+
+    def __validate(value, exp_type=None, length=None):
+        """
+            Валидация аргумента по типу и/или длине
+        Args:
+            value (any): Передаваемый аргумент
+            type (object): Ожидаемый тип
+            length (int): Ожидаемая длина
+        Raises:
+            TypeError: Некорректный тип аргумента
+            ValueError: Некорректная длина аргумента
+        Returns:
+            True или Exception взависимости от результата валидации
+        """
+
+        # Проверяем соответствие типа
+        if exp_type is not None and not isinstance(value, exp_type):
+            raise TypeError("Некорректный тип аргумента")
+        
+        # Проверяем соответствие длины
+        if length is not None and len(str(value)) != length:
+            raise ValueError("Некорректная длина аргумента")
+        
+        return True
     
     @property
     def first_name(self):
@@ -23,8 +48,8 @@ class settings:
         Raises:
             TypeError: Некорректный аргумента
         """
-        if not isinstance(value, str):
-            raise TypeError("Некорректный аргумент!")
+
+        settings.__validate(value, str)
         
         self.__first_name = value.strip()
 
@@ -44,11 +69,7 @@ class settings:
             ValueError: Некорректная длина аргумента
         """
 
-        if not isinstance(value, int):
-            raise TypeError("Некорректный тип аргумента")
-        
-        if not len(str(value)) == 12:
-            raise ValueError("Некорректная длина аргумента")
+        settings.__validate(value, int, 12)
 
         self.__tax_id = value
     
@@ -68,11 +89,7 @@ class settings:
             ValueError: Некорректная длина аргумента
         """
 
-        if not isinstance(value, int):
-            raise TypeError("Некорректный тип аргумента")
-        
-        if not len(str(value)) == 9:
-            raise ValueError("Некорректная длина аргумента")
+        settings.__validate(value, int, 9)
 
         self.__bank_id = value
 
@@ -93,11 +110,7 @@ class settings:
             ValueError: Некорректная длина аргумента
         """
 
-        if not isinstance(value, int):
-            raise TypeError("Некорректный тип аргумента")
-        
-        if not len(str(value)) == 11:
-            raise ValueError("Некорректная длина аргумента")
+        settings.__validate(value, int, 11)
 
         self.__bank_account_id = value
         
@@ -118,11 +131,7 @@ class settings:
             ValueError: Некорректная длина аргумента
         """
 
-        if not isinstance(value, int):
-            raise TypeError("Некорректный тип аргумента")
-        
-        if not len(str(value)) == 11:
-            raise ValueError("Некорректная длина аргумента")
+        settings.__validate(value, int, 11)
 
         self.__corresp_account_id = value
 
@@ -142,9 +151,7 @@ class settings:
             TypeError: Некорректный тип аргумента
         """
 
-        if not isinstance(value, str):
-            raise TypeError("Некорректный тип аргумента")
-        
+        settings.__validate(value, str) 
 
         self.__property_name = value
 
@@ -165,10 +172,6 @@ class settings:
             ValueError: Некорректная длина аргумента
         """
 
-        if not isinstance(value, str):
-            raise TypeError("Некорректный тип аргумента")
-        
-        if not len(str(value)) == 5:
-            raise ValueError("Некорректная длина аргумента")
+        settings.__validate(value, str, 5)
 
         self.__property_type = value

+ 12 - 1
src/settings_manager.py

@@ -7,6 +7,7 @@ class settings_manager (object):
     __data = {}
 
 
+    # Возвращаем существующий инстанс при вызове new() (singleton)
     def __new__(cls):
         if not hasattr(cls, "instance"):
             cls.instance = super(settings_manager, cls).__new__(cls)
@@ -26,12 +27,16 @@ class settings_manager (object):
         Raises:
             Exception: Невозможно создать экземпляр класса настроек
         """
+        # Создаем инстанс settings, если он еще не создан
         if not self.__settings:
             self.__settings = settings()
+        # Выбрасываем ошибку, если тип __settings не соответствует нужному
         if not isinstance(self.__settings, settings):
             raise Exception("Невозможно создать экземпляр класса настроек")
+        # Переносим считанные значения в инстанс настроек
         for key in self.__data.keys():
-            if not hasattr(self.__settings, key): return
+            # Пропускаем, если у settings нет соответствующего свойства
+            if not hasattr(self.__settings, key): continue
             setattr(self.__settings, key, self.__data[key])
 
     def open(self, filename):
@@ -43,12 +48,15 @@ class settings_manager (object):
             TypeError: Неверный тип аргумента
             ValueError: Неверная длина аргумента
         """
+        # Проверяем, чтобы путь был строкой
         if not isinstance(filename, str):
             raise TypeError("Неверный тип аргумента")
         
+        # Проверяем, чтобы путь не был пуст
         if len(filename) == 0:
             raise ValueError("Неверная длина аргумента")
         
+        # Убираем leading/trailing пробелы
         self.__filename = filename.strip()
         return self.__open()
 
@@ -61,12 +69,15 @@ class settings_manager (object):
 
         settings_file = self.__filename
 
+        # Проверяем, существует ли файл по данному пути
         if not os.path.exists(settings_file):
             raise FileNotFoundError("Невозможно загрузить файл настроек")
         
+        # Открываем файл и парсим JSON
         with open(settings_file, "r", encoding="UTF-8") as read_file:
             self.__data = json.load(read_file)
         
+        # Заполняем объект settings прочитанными значениями
         self.__convert()
 
         return True