Вредные побочные эффекты для разных именованных кортежей с одинаковым typename?

Рассмотрим следующую функцию:

>>> from collections import namedtuple
>>> def make_thing(**kwargs):
...     ThingClass = namedtuple('ThingClass', kwargs.keys())
...     return ThingClass(**kwargs)
...
>>> make_thing(x=1,y=2,z=3)
ThingClass(y=2, x=1, z=3)
>>> make_thing(a=4,b=5,c=6)
ThingClass(a=4, c=6, b=5)
>>>

Вызовы функций namedtuple создать "временный" класс с именами полей, совпадающими с входными dictключи. Затем он возвращает экземпляр с заполненными значениями.

Мой вопрос заключается в том, есть ли у этого какие-либо конкретные подводные камни с typename аргумент namedtuple всегда одно и то же, даже если есть разные имена полей. Например, если namedtuple создал в фоновом режиме класс, который будет переопределен при этом, тогда я мог видеть некоторое потенциально странное поведение, возникающее позже. Есть ли побочные эффекты / ошибки для этого?

Дополнительная информация:

Если вам интересно, что за хрень, которую я делаю, позволила бы мне написать этот код, у меня есть ORM, который несколько возвращает dictрезультаты Я видел, как объекты ведут себя странно с присваиванием, и я действительно предпочел бы не передавать объекты, которые могут иметь или не иметь возможность изменять мою базу данных (в зависимости от того, как написан код запроса). Попытка сохранить объекты DTO для каждого отдельного запроса кажется слишком сложной задачей, равно как и попытка сделать все мои запросы совместимыми с небольшим набором DTO. Таким образом, я придумал это как быстрый и простой способ обойти четко неизменяемые объекты, где я мог бы написать такой код, как dto.a, По сути, это динамический генератор DTO на лету. Это также покупает мне довольно хороший repr реализация, когда я отлаживаю.

1 ответ

Решение

Подводных камней нет, занятия не зарегистрированы централизованно.

Все, что вы видите, это классы, использующие self.__name__ генерировать строку представления. Сами классы живут только как .__class__ ссылки на экземпляры, поскольку локальное имя очищается, когда make_thing() Функция заканчивается.

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