Является ли использование __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)