import re
class Field:
def __init__(self):
self.my_list = {}
self.my_set_key = set()
def to_my_list_tuple(self, str_val1, str_val2):
key_str = None
key_int = None
if isinstance(str_val1, int):
if str_val1 > 0:
if isinstance(str_val2, str):
if len(str_val2) == 1 and str_val2.isalpha():
key_str = str_val2.lower()
key_int = str_val1
return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
elif isinstance(str_val2, int):
if str_val2 > 0:
if isinstance(str_val1, str):
if len(str_val1) == 1 and str_val1.isalpha():
key_str = str_val1.lower()
key_int = str_val2
return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
elif isinstance(str_val1, str) and isinstance(str_val2, str):
if ('.' in str_val1) or ('.' in str_val2) or ('-' in str_val1) or ('-' in str_val2):
raise ValueError
# return key_str, key_int
else:
if (str_val1.isdigit()) and (int(str_val1) > 0):
if str_val2.isalpha() and len(str_val2) == 1:
key_str = str_val2.lower()
key_int = str_val1
return key_str, key_int
else:
raise ValueError
# return key_str, key_int
elif str_val1.isalpha() and len(str_val1) == 1:
if (str_val2.isdigit()) and (int(str_val2) > 0):
key_str = str_val1.lower()
key_int = int(str_val2)
return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
def to_my_list_str(self, str_val1, str_val2=None):
key_str = None
key_int = None
if isinstance(str_val1, str) and (str_val2 is None):
if ('.' in str_val1) or ('-' in str_val1):
raise ValueError
# return key_str, key_int
elif len(str_val1) == 1:
raise ValueError
# return key_str, key_int
else:
num_value = re.findall(r'\d+', str_val1)
match_value = re.findall(r'(?i)[a-z,A-Z]+', str_val1)
match_value = ''.join(match_value)
if len(match_value) == 1:
key_str = match_value.lower()
key_int = int("".join(list(map(str, num_value))))
return key_str, key_int
else:
raise ValueError
# return key_str, key_int
else:
raise ValueError
# return key_str, key_int
def str_my_list(self, key_str, key_int):
if key_str is None and key_int is None:
new_key = None
else:
new_key = str(key_str) + str(key_int)
return new_key
def my_new_key(self, key):
if isinstance(key, tuple) or isinstance(key, str):
if isinstance(key, tuple):
key_str, key_int = self.to_my_list_tuple(str_val1=key[0], str_val2=key[1])
new_key = self.str_my_list(key_str=key_str, key_int=key_int)
return new_key
elif isinstance(key, str):
key_str, key_int = self.to_my_list_str(str_val1=key, str_val2=None)
new_key = self.str_my_list(key_str=key_str, key_int=key_int)
return new_key
else:
raise TypeError
def __setitem__(self, key, value):
new_key = None
new_key = self.my_new_key(key)
if new_key is None:
raise ValueError
else:
self.my_list[new_key] = value
if new_key in self.my_set_key:
pass
else:
self.my_set_key.add(new_key)
def __getitem__(self, key):
new_key = self.my_new_key(key)
if new_key in self.my_list:
return self.my_list[new_key]
else:
return None
def __iter__(self):
self.froz_set = frozenset(self.my_set_key)
for key in self.my_list:
yield key
def __delitem__(self, key):
new_key = self.my_new_key(key)
# del self.my_set_key[new_key]
del self.my_list[new_key]
def __contains__(self, key):
new_key = self.my_new_key(key)
# print(new_key in self.my_list)
return new_key in self.my_list
Совсем исходный код. Есть отбор ключей (для любого field - квадратные скобки).
Да, проблема как к этому добавить field.ключ (обращение через точку __setattr__) - запись, обращение и удаление.
Обращение, как бы можно обойти:
def __getitem__(self, key):
try:
new_key = self.my_new_key(key)
if new_key in self.my_list:
return self.my_list[new_key]
else:
return None
except:
new_key = self.__getattr__(self, key)
А когда записываю, то надо добавить реализацию через __setattr_, а try: exept - даст обработку только ключей с . и потерю . Значит надо или через get, или может как-то переносить словарь…. еще не додумала до конца.