# Python-биндинги к libyson ## Высокоуровневый интерфейс Функции `dumps`, `loads` для преобразования строк: ```python >>> from cyson import dumps, loads >>> print dumps(1234) 1234 >>> print dumps("Hello world! Привет!") "Hello world! Привет!" >>> print dumps([1, "foo", None, {'aaa': 'bbb'}]) [1; "foo"; #; {"aaa" = "bbb"}] >>> dumps([1, "foo", None, {'aaa': 'bbb'}], format='binary') '[\x02\x02;\x01\x06foo;#;{\x01\x06aaa=\x01\x06bbb}]' >>> print dumps([1, "foo", None, {'aaa': 'bbb'}], format='pretty') [ 1; "foo"; #; { "aaa" = "bbb" } ] >>> loads('1234') 1234 >>> loads('3.14') 3.14 >>> loads('[1; "foo"; #; {"aaa" = "bbb"}]') [1, 'foo', None, {'aaa': 'bbb'}] >>> loads('[\x02\x02;\x01\x06foo;#;{\x01\x06aaa=\x01\x06bbb}]') [1, 'foo', None, {'aaa': 'bbb'}] ``` Функции `list_fragments`, `map_fragments` для удобного чтения из входного потока. ```python import cyson input = cyson.list_fragments( cyson.InputStream.from_fd(STDIN_FILENO), process_table_index=True, ) for record in input: ... ``` ## Низкоуровневый интерфейс ### Адаптеры потоков ввода-вывода Классы `InputStream`, `OutputStream` не предоставляют никакой функциональности сами по себе, но позволяют подключить поток ввода/вывода к Reader или Writer. Конструкторы классов - статические методы с именами `from_*`: ```python input = cyson.InputStream.from_fd(0) input = cyson.InputStream.from_string("...") input = cyson.InputStream.from_iter(iter_chunks) output = cyson.OutputStream.from_fd(1) output = cyson.OutputStream.from_file(stringio_file) ``` ### Reader/Writer `Reader` - самый быстрый метод десериализации, и в целом позволяет получать объекты привычных и ожидаемых типов. При отсутствии атрибутов, порождает встроенные типы, иначе - `Yson*`. Не позволяет различать `list`/`tuple`, или получать на входе `set`. `Writer` позволяет выводить низкоуровневые элементы потока, или сериализовать объекты. Для сериализации объектов следует использовать метод `write()`. ### StrictReader `StrictReader` отличается от Reader тем, что всегда создает объекты типа `Yson*`, независимо от наличия атрибутов. Никакое специальное поведение при записи в таком случае не требуется, так что вместе с ним можно использовать обычный `Writer`. ### PyReader/PyWriter Пара для сериализации-десериализации произвольных python-типов. Тип кодируется атрибутом `py` у значения. Поддержка дополнительных типов добавляется с помощью декораторов `pywriter_handler`, `pyreader_scalar_handler`, `pyreader_list_handler`, `pyreader_map_handler`. ### UnicodeReader Декодирует все строки в юникод. Удобен при работе с `python3`, но может ухудшить производительность.