No sé cuánto tiene que ver esto con Redis, creo que es una brecha en mi comprensión de Python.

Si tengo un diccionario cuyo valor es un valor simple, esto funciona bien:

obj = {'key': 'value'}
redis.publish('ch', obj)

Pero si el diccionario tiene un valor que es un diccionario, falla:

# from the console in debug mode:
>>> {key: value}
{'tray_info': b'{"rows_count":0,"columns_count":0}'}
>>> redis.publish('ch', {key: value})
TypeError: Argument {'tray_info': b'{"rows_count":0,"columns_count":0}'} expected to be of bytearray, bytes, float, int, or str type

Puedo hacer que redis se publique si convierto el valor de dict en una cadena:

if isinstance(value, bytes):
    v = value.decode('utf8')
    message = json.dumps({key: v})
else:
    message = json.dumps({key: value}).encode('utf-8')
redis.publish('ch', message)

Pero luego el mensaje publicado tiene un valor que es una cadena, la versión en cadena del diccionario.

En mi cliente JS, tendría que volver a convertirlo en un JSON, y de alguna manera tendría que verificar si mi valor era una "cadena legítima" o si estaba destinado a ser un JSON, y se vuelve ridículo.

Imagino que hay algo relativamente simple sobre Python que me falta. ¿Cómo hago esto?

0
Jonathan Tuzman 28 ago. 2020 a las 22:32

1 respuesta

La mejor respuesta

Según la documentación, Redis no admite mapas anidados:

Redis Hashes son mapas entre campos de cadena y valores de cadena

1
donkopotamus 28 ago. 2020 a las 20:02