Как передать объекты Python (которые не сериализуемы в JSON) из одной (AWS) лямбда-функции в другую? - PullRequest
1 голос
/ 17 октября 2019

Если вы попытаетесь отправить объект, который не поддерживает сериализацию JSON (кроме списка, словаря, целого числа и т. Д.), Вы получите следующее сообщение об ошибке:

"errorMessage": "Object of type set is not JSON serializable"

Даже если вы отправите tuple, он преобразуется в list при передаче во вторую лямбду.

Итак, каковы обходные пути, если вы хотите сохранить объект?

1 Ответ

1 голос
/ 17 октября 2019

Одна опция:

  • Создать закодированное строковое представление объекта и передать его, используя такую ​​функцию:

    def native_object_encoded(x):
        x = pickle.dumps(x)
        x = zlib.compress(x)
        x = base64.b64encode(x).decode()
        return x
    
  • Во второй лямбда-функции выполните те же шаги в обратном порядке, чтобы вернуть исходный объект:

    def native_object_decoded(s):
        s = base64.b64decode(s)
        s = zlib.decompress(s)
        s = pickle.loads(s)
        return s
    

Использование:

# lambda 1 (the caller)
a = {66, 99, 35} # set: not serializable
payload = {
    'a': native_object_encoded(a),
}
response = client.invoke(
...
)

# lambda 2 (the one being invoked)
a = native_object_decoded(event['a'])

Примечания:

  • Если объект имеет пользовательский тип, этот тип также должен быть определен во второй лямбда-функции.
  • Если объект является частью какой-либо другой библиотеки (стандартноили сторонние), эта библиотека должна быть импортирована во второй лямбда-функции.
  • Шаг сжатия необязательный.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...