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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
"""Benchmark attrs containing other attrs classes."""
import pytest
from attrs import define
from cattr import BaseConverter, Converter, UnstructureStrategy
@pytest.mark.parametrize("converter_cls", [BaseConverter, Converter])
@pytest.mark.parametrize(
"unstructure_strat", [UnstructureStrategy.AS_DICT, UnstructureStrategy.AS_TUPLE]
)
def test_unstructure_attrs_nested(benchmark, converter_cls, unstructure_strat):
c = converter_cls(unstruct_strat=unstructure_strat)
@define
class InnerA:
a: int
b: float
c: str
d: bytes
@define
class InnerB:
a: int
b: float
c: str
d: bytes
@define
class InnerC:
a: int
b: float
c: str
d: bytes
@define
class InnerD:
a: int
b: float
c: str
d: bytes
@define
class InnerE:
a: int
b: float
c: str
d: bytes
@define
class Outer:
a: InnerA
b: InnerB
c: InnerC
d: InnerD
e: InnerE
inst = Outer(
InnerA(1, 1.0, "one", b"one"),
InnerB(2, 2.0, "two", b"two"),
InnerC(3, 3.0, "three", b"three"),
InnerD(4, 4.0, "four", b"four"),
InnerE(5, 5.0, "five", b"five"),
)
benchmark(c.unstructure, inst)
@pytest.mark.parametrize("converter_cls", [BaseConverter, Converter])
@pytest.mark.parametrize(
"unstructure_strat", [UnstructureStrategy.AS_DICT, UnstructureStrategy.AS_TUPLE]
)
def test_unstruct_attrs_deep_nest(benchmark, converter_cls, unstructure_strat):
c = converter_cls(unstruct_strat=unstructure_strat)
@define
class InnerA:
a: int
b: float
c: str
d: bytes
@define
class InnerB:
a: InnerA
b: InnerA
c: InnerA
d: InnerA
@define
class InnerC:
a: InnerB
b: InnerB
c: InnerB
d: InnerB
@define
class InnerD:
a: InnerC
b: InnerC
c: InnerC
d: InnerC
@define
class InnerE:
a: InnerD
b: InnerD
c: InnerD
d: InnerD
@define
class Outer:
a: InnerE
b: InnerE
c: InnerE
d: InnerE
def make_inner_a():
return InnerA(1, 1.0, "one", b"one")
def make_inner_b():
return InnerB(*[make_inner_a() for _ in range(4)])
def make_inner_c():
return InnerC(*[make_inner_b() for _ in range(4)])
def make_inner_d():
return InnerD(*[make_inner_c() for _ in range(4)])
def make_inner_e():
return InnerE(*[make_inner_d() for _ in range(4)])
inst = Outer(*[make_inner_e() for _ in range(4)])
benchmark(c.unstructure, inst)
|