cython

Форк
0
/
ext_attr_assign.pyx 
106 строк · 2.1 Кб
1
# mode: run
2
# tag: assign, exttype
3

4
cdef struct X:
5
    int ix
6
    X* x
7

8

9
cdef class A:
10
    cdef int i
11
    cdef list l
12
    cdef object o
13
    cdef X x
14

15
    def assign_A(self):
16
        """
17
        >>> A().assign_A()
18
        (2, [1, 2, 3])
19
        """
20
        a = A()
21
        a.i = 1
22
        a.l = [1, 2, 3]
23
        a.o = a.l
24
        a.o = a.o
25
        a.l = a.o
26
        a.i = a.l[1]
27
        return a.i, a.l
28

29
    def assign_A_struct(self):
30
        """
31
        >>> A().assign_A_struct()
32
        (5, 2, 2, 5)
33
        """
34
        cdef X x
35
        a = A()
36
        a.x.ix = 2
37
        a.x.x = &x
38
        x.ix = 5
39
        x.x = &a.x
40
        assert a.x.x.x is &a.x
41

42
        a.x.x.x.x.x.x.x = a.x.x.x.x
43
        assert x.x is &x
44
        assert x.x.x is &x
45
        assert a.x.x is &x
46

47
        a.x.x.x.x.x.x.x, a.x.x.x = a.x.x.x.x, &a.x   # replay+undo :)
48
        assert x.x is &a.x
49
        assert x.x.x is &x
50
        return x.ix, x.x.ix, a.x.ix, a.x.x.ix
51

52

53
cdef class B(A):
54
    cdef int ib
55
    cdef object ob
56
    cdef A a
57

58
    def assign_B(self):
59
        """
60
        >>> B().assign_B()
61
        (1, 2, 5, 9, 2)
62
        """
63
        b = B()
64
        b.i = 1
65
        b.ib = 2
66
        b.l = [b.i, b.ib]
67
        b.o = b.l
68
        b.ob = b.o
69
        assert b.ob == b.l
70
        b.o = b.ob = b.l
71

72
        b.a = A()   # only one reference!
73
        b.a.o = 5
74
        b.a.i = 5
75
        b.a, b.a.i = A(), b.a.i  # overwrite b.a but keep b.a.i
76
        assert b.a.i == 5
77
        assert b.a.o is None
78
        b.a.o = 9
79
        b.a, b.a.i, b.a.o = A(), b.a.i, b.a.o
80
        return b.i, b.ib, b.a.i, b.a.o, b.o[1]
81

82
    def cross_assign_Ba(self):
83
        """
84
        >>> B().cross_assign_Ba()
85
        2
86
        """
87
        b = B()
88
        b.a = A()
89
        b.a.i = 1
90
        b.a.o = A()   # only one reference!
91
        (<A>b.a.o).i = 2
92
        b.a = b.a.o
93
        return b.a.i
94

95
    def cascaded_assign_B(self):
96
        """
97
        >>> B().cascaded_assign_B()
98
        (2, 2)
99
        """
100
        cdef B b = B()
101
        b.ib = 1
102
        b.a = A()
103
        b.a.o = B()   # only one reference!
104
        (<B>b.a.o).ib = 2
105
        b = b.ob = b.a.o
106
        return b.ib, (<B>b.ob).ib
107

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

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

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

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