Есть ли способ обойти магию Дандера в питоне?

У меня есть несколько лямбда-выражений AWS, написанных на python, где я возвращаю классы данных python, которые маршалируются в словари, а затем возвращаются для перевода в graphql с помощью appsync. Схема graphql, определенная (не мной), немного полиморфна. Например, в одном случае объект, который я намереваюсь вернуть, представляет собой UserProfile, а схема graphql определяет следующее:

union ProfileContext = UserProfile | PublicUserProfile

(Есть также вложенные экземпляры этого). Чтобы вернуть это, appsync требует, чтобы словарь, который я передаю ему, описывающий ProfileContext, имел атрибут __typename. Моим первым побуждением было следующее:

@dataclass
class UserProfile:

    ...

    @property
    def __typename(self):
        return 'UserProfiles'

Но, конечно же, я столкнулся с магией дандера Python, и свойство на самом деле получило имя _UserProfile__typename. Есть ли способ дать объекту python свойство, которое на самом деле называется __typename? (В основном обход магии dunder, чтобы сделать appsync счастливым)

Если нет, мне придется вручную перемещаться по деревьям объектов после десортировки или создавать какой-то пользовательский демаршаллер, используя что-то вроде зефира.


person tofarr    schedule 01.06.2021    source источник
comment
Если я правильно понял, этот ответ должен помочь. Проверьте это.   -  person Selcuk    schedule 01.06.2021
comment
Это правильный ответ. Спасибо!   -  person tofarr    schedule 01.06.2021