1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# 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`, но может
ухудшить производительность.
|