cython

Форк
0
/
pure_cdef_class_dataclass.py 
89 строк · 2.7 Кб
1
# mode: run
2
# tag: dataclass, pure3.7
3

4
from __future__ import print_function
5

6
import cython
7

8
# cython.dataclasses implicitly implies cclass
9
@cython.dataclasses.dataclass(order=True, unsafe_hash=True)
10
class MyDataclass:
11
    """
12
    >>> sorted(list(MyDataclass.__dataclass_fields__.keys()))
13
    ['a', 'self']
14
    >>> inst1 = MyDataclass(2, ['a', 'b'])
15
    >>> print(inst1)
16
    MyDataclass(a=2, self=['a', 'b'])
17
    >>> inst2 = MyDataclass()
18
    >>> print(inst2)
19
    MyDataclass(a=1, self=[])
20
    >>> inst1 == inst2
21
    False
22
    >>> inst1 > inst2
23
    True
24
    >>> inst2 == MyDataclass()
25
    True
26
    >>> hash(inst1) != id(inst1)
27
    True
28
    >>> inst1.func_with_annotations(2.0)
29
    4.0
30
    """
31

32
    a: int = 1
33
    self: list = cython.dataclasses.field(default_factory=list, hash=False)  # test that arguments of init don't conflict
34

35
    def func_with_annotations(self, b: float):
36
        c: float = b
37
        return self.a * c
38

39

40
class DummyObj:
41
    def __repr__(self):
42
        return "DummyObj()"
43

44

45
@cython.dataclasses.dataclass
46
@cython.cclass
47
class NoInitFields:
48
    """
49
    >>> NoInitFields()
50
    NoInitFields(has_default=DummyObj(), has_factory='From a lambda', neither=None)
51
    >>> NoInitFields().has_default is NoInitFields().has_default
52
    True
53

54
    >>> NoInitFields(1)  # doctest: +IGNORE_EXCEPTION_DETAIL
55
    Traceback (most recent call last):
56
    TypeError: NoInitFields.__init__() takes 1 positional argument but 2 were given
57

58
    >>> NoInitFields(has_default=1)  # doctest: +ELLIPSIS
59
    Traceback (most recent call last):
60
    TypeError: ...has_default...
61
    >>> NoInitFields(has_factory=1)  # doctest: +ELLIPSIS
62
    Traceback (most recent call last):
63
    TypeError: ...has_factory...
64
    >>> NoInitFields(neither=1)  # doctest: +ELLIPSIS
65
    Traceback (most recent call last):
66
    TypeError: ...neither...
67
    """
68
    has_default : object = cython.dataclasses.field(default=DummyObj(), init=False)
69
    has_factory : object = cython.dataclasses.field(default_factory=lambda: "From a lambda", init=False)
70
    # Cython will default-initialize to None
71
    neither : object = cython.dataclasses.field(init=False)
72

73
    def __post_init__(self):
74
        if not cython.compiled:
75
            # Cython will default-initialize this to None, while Python won't
76
            # and not initializing it will mess up repr
77
            assert not hasattr(self, "neither")
78
            self.neither = None
79

80

81
@cython.dataclasses.dataclass
82
class NonInitDefaultArgument:
83
    """
84
    >>> NonInitDefaultArgument(1.0, "hello")
85
    NonInitDefaultArgument(x=1.0, y=10, z='hello')
86
    """
87
    x: float
88
    y: int = cython.dataclasses.field(default=10, init=False)
89
    z: str  # This is allowed despite following a default argument, because the default argument isn't in init
90

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

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.