Глядя на ваш пример, я имею в виду другой взгляд на код.У меня была бы проблема со строгим доказательством моей точки зрения, но интуитивно HashData
не является большой абстракцией.Он имеет дело со списком / генератором внутри класса без предварительного описания операций над элементами списка.Ваш код повторяет for
циклы внутри методов, что не является хорошим знаком.
HashData
имеет преимущество объединения ваших методов вместе, но, глядя на это с нуля, это в основном цепочка операций в списке строк.Не существует состояния объекта, нескольких переменных, которые можно хранить вместе, или других вещей, которые являются общими для выполнения класса, в отличие от функции.
Мой взгляд на вашу задачу таков:
a) вы можете иметь всего несколько «примитивных» функций, как показано ниже,
import re
from hashlib import sha256
PATTERN = re.compile(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)")
def is_string(raw_string: str) -> bool:
return isinstance(raw_string, str)
def clean(raw_string: str) -> str:
return raw_string.strip().lower()
def is_email(text: str, pattern=PATTERN) -> bool:
return pattern.match(text)
def encrypt(text: str):
text = text.encode('UTF8') # hashlib requires encoding before hashing
return sha256(text).hexdigest()
b) Вы можете связатьмаленькие функции превращают их в трубу операций, как показано ниже или каким-либо другим способом
email_list = ['gigantic@list1000.com', 'tons@ofemail.org'] * 100
# check type
gen = filter(is_string, email_list)
# cleanup
gen = map(clean, gen)
# filter
gen = filter(is_email, gen)
# encrypt
hash_list = list(map(encrypt, gen))
в) Если вы действительно хотите класс, я бы предложил создать что-то маленькое и управляемое, например, ниже
class Address:
def __init__(self, raw_string: str):
if not is_string(raw_string):
raise TypeError(raw_string)
text = clean(raw_string)
if not is_email(text):
raise ValueError(text)
self._text = text
def email(self):
return self._text
def hash(self):
return encrypt(self._text)
hash_list2 = [Address(s).hash() for s in email_list]
assert hash_list == hash_list2