Как получить доступ к вложенному словарю с помощью @property

Я могу установить атрибуты класса с помощью декоратора @property, используя следующий код, однако я не могу установить атрибуты (в иерархии), если это вложенный словарь. Например, если нам нужно напечатать значение «порт», которое находится во вложенном «учетных данных», то как я могу использовать печать (obj.credentials.port), а не печать (obj.port)

class TestDec:
    def __init__(self,value) -> None:
        self.value = value
    @property
    def description(self):
        return self.value["description"]
    @property
    def credentials(self):
        return self.value["credentials"]
    @property
    def username(self):
        return self.value["credentials"]["username"]  
    @property
    def password(self):
        return self.value["credentials"]["password"]   
    @property
    def port(self):
        try:
            return self.value["credentials"]["port"]      
        except KeyError:
            pass                    

obj = TestDec({"description":"test decorator","credentials":{"username":"abc","password":"xxxx","port":"5432"}})
print(obj.description)
print(obj.credentials)
print(obj.username)
print(obj.password)
print(obj.port)

Просто получите доступ к obj.value["credentials"], как это делает функция @property.

martineau 10.04.2022 04:44
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Либо у вас есть ошибка с obj.username и подобным, и она должна быть obj.credentials.username (как в моем примере ниже), либо вы хотите рекурсивно искать ключ, что я не думаю, что это хорошая идея. Но для этой вложенной точки доступа к элементам словаря этого может быть достаточно.

from collections import UserDict


class MyDict(UserDict):
    def __getattr__(self, arg):
        try:
            result = self.data[arg]
        except KeyError as error:
            raise AttributeError from error

        if isinstance(result, dict):
            return MyDict(result)
        return result


obj = MyDict(
    {
        "description": "test decorator",
        "credentials": {"username": "abc", "password": "xxxx", "port": "5432"},
    }
)
print(obj.description)
print(obj.credentials)
print(obj.credentials.username)
print(obj.credentials.password)
print(obj.credentials.port)

Если вам нужно установить значение с той же точечной нотацией, рассмотрите возможность взглянуть на __setattr__()

Dmytro O 10.04.2022 05:18

Другие вопросы по теме