Вредные побочные эффекты для разных именованных кортежей с одинаковым 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()
Функция заканчивается.