Acceso a atributos de tipo objeto para diccionario anidado

Estoy utilizando un paquete que devuelve un diccionario anidado. Se siente incómodo acceder a este objeto de retorno en mis métodos de clase con la sintaxis del diccionario, cuando todo lo demás está en la sintaxis del objeto. La búsqueda me ha llevado a los paquetes bunch / neobunch, que parece lograr lo que busco. También he visto sugerencias de nombres nombrados, pero estos no admiten fácilmente los atributos anidados y la mayoría de las soluciones dependen del uso de diccionarios dentro de los nombres para la anidación.

¿Cuál sería una forma más natural de lograr esto?

data = {'a': 'aval', 'b': {'b1':{'b2a':{'b3a':'b3aval','b3b':'b3bval'},'b2b':'b2bval'}} }

print(data['b']['b1']['b2a']['b3b'])  # dictionary access
# print(data.b.b1.b2a.b3b)  # desired access

import neobunch
data1 = neobunch.bunchify(data)
print(data1.b.b1.b2a.b3b)

Respuestas a la pregunta(2)

Su respuesta a la pregunta