Является ли использование __getattribute__ для namedtuple: плохой практикой?

Я изучаю возможность замены очень большого количества небольших словарей вместо именованных кортежей.

Поскольку ключи dict (строки) были сопоставлены с именами полей именованных кортежей, я должен использовать излишний метод getattribute именованного кортежа для доступа к значениям.

Это не только делает код немного странным, но мне также интересно, является ли это плохой практикой?

1 ответ

Поскольку ключи dict (строки) были сопоставлены с именами полей именованных кортежей, я должен использовать излишний метод getattribute именованного кортежа для доступа к значениям.

Это неправильный инструмент. Вы должны использовать getattr встроенная функция, а не __getattribute__ метод:

getattr(your_namedtuple, attribute_name)

Тем не менее, если вы хотите в первую очередь получить доступ к вашим данным по имени, а не по индексу, вызов getattr все время будет неловко Вы могли бы подкласс вашего namedtuple класс и изменить как __getitem__ работает, так что вы все еще можете использовать индексирование нотации:

class MyType(namedtuple(...)):
    __slots__ = () # avoid creating instance __dict__s
    def __getitem__(self, index):
        try:
            return super().__getitem__(index)
        except TypeError:
            return getattr(self, index)
Другие вопросы по тегам