Я пытаюсь реализовать настраиваемое поведение структуры данных dict
.
Я хочу переопределить __getitem__
и применить какое-либо регулярное выражение к значению, прежде чем возвращать его пользователю.
Фрагмент:
class RegexMatchingDict(dict):
def __init__(self, dct, regex, value_group, replace_with_group, **kwargs):
super().__init__(**kwargs)
self.replace_with_group = replace_with_group
self.value_group = value_group
self.regex_str = regex
self.regex_matcher = re.compile(regex)
self.update(dct)
def __getitem__(self, key):
value: Union[str, dict] = dict.__getitem__(self, key)
if type(value) is str:
match = self.regex_matcher.match(value)
if match:
return value.replace(match.group(self.replace_with_group), os.getenv(match.group(self.value_group)))
return value # I BELIEVE ISSUE IS HERE
Это прекрасно работает для одного уровня индекса (т. Е. dict[key]
).Однако при попытке его многоиндексировать (т. Е. dict[key1][key2]
) происходит следующее: первый уровень индекса возвращает объект из моего класса.Но другие уровни вызывают значение по умолчанию __getitem__
в dict
, которое не выполняет мое настроенное поведение.Как это исправить?
MCVE:
Вышеупомянутый код применяет регулярное выражение к значению и преобразует его в соответствующее значение переменной среды, если оно является строкой (то естьсамый низкий уровень в dict)
dictionary = {"KEY": "{ENVIRONMENT_VARIABLE}"}
custom_dict = RegexMatchingDict(dictionary, r"((.*({(.+)}).*))", 4 ,3)
Давайте установим переменную env с именем ENVIRONMENT_VARIABLE
, установленную в 1
.
import os
os.environ["ENVIRONMENT_VARIABLE"] = "1"
В этом случае код работает отлично
custom_dict["KEY"]
и возвращаемое значение будет:
{"KEY": 1}
Однако, если бы у нас была многоуровневая индексация
dictionary = {"KEY": {"INDEXT_KEY": "{ENVIRONMENT_VARIABLE}"}
custom_dict = RegexMatchingDict(dictionary, r"((.*({(.+)}).*))", 4 ,3)
custom_dict["KEY"]["INDEX_KEY"]
Это вернуло бы
{ENVIRONMENT_VARIABLE}
PS Существует много похожих вопросов, но все они (вероятно) касаются индексации верхнего уровня.