File: dictproxyobject.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (129 lines) | stat: -rw-r--r-- 4,654 bytes parent folder | download | duplicates (3)
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
"""
Read-only proxy for mappings.

Its main use is as the return type of cls.__dict__.
"""

from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import oefmt
from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
from pypy.interpreter.typedef import TypeDef, interp2app
from pypy.objspace.std.util import generic_alias_class_getitem

class W_DictProxyObject(W_Root):
    "Read-only proxy for mappings."

    def __init__(self, w_mapping):
        self.w_mapping = w_mapping

    @staticmethod
    def descr_new(space, w_type, w_mapping):
        if (not space.lookup(w_mapping, "__getitem__") or
                space.isinstance_w(w_mapping, space.w_list) or
                space.isinstance_w(w_mapping, space.w_tuple)):
            raise oefmt(space.w_TypeError,
                        "mappingproxy() argument must be a mapping, not %T",
                        w_mapping)
        return W_DictProxyObject(w_mapping)

    def descr_init(self, space, __args__):
        pass

    def descr_len(self, space):
        return space.len(self.w_mapping)

    def descr_getitem(self, space, w_key):
        return space.getitem(self.w_mapping, w_key)

    def descr_contains(self, space, w_key):
        return space.contains(self.w_mapping, w_key)

    def descr_iter(self, space):
        return space.iter(self.w_mapping)

    def descr_str(self, space):
        return space.str(self.w_mapping)

    def descr_repr(self, space):
        return space.newtext(b"mappingproxy(%s)" %
                                (space.utf8_w(space.repr(self.w_mapping)),))

    def descr_or(self, space, w_other):
        if isinstance(w_other, W_DictProxyObject):
            w_other = w_other.w_mapping
        if not space.isinstance_w(w_other, space.w_dict):
            return space.w_NotImplemented
        w_copyself = self.copy_w(space)
        space.call_method(w_copyself, "update", w_other)
        return w_copyself

    def descr_ror(self, space, w_other):
        if isinstance(w_other, W_DictProxyObject):
            w_other = w_other.w_mapping
        if not space.isinstance_w(w_other, space.w_dict):
            return space.w_NotImplemented
        return space.call_method(w_other, "__or__", self.w_mapping)

    def descr_ior(self, space, w_other):
        raise oefmt(space.w_TypeError,
            "'|=' is not supported by mappingproxy; use '|' instead")

    @unwrap_spec(w_default=WrappedDefault(None))
    def get_w(self, space, w_key, w_default):
        return space.call_method(self.w_mapping, "get", w_key, w_default)

    def keys_w(self, space):
        return space.call_method(self.w_mapping, "keys")

    def values_w(self, space):
        return space.call_method(self.w_mapping, "values")

    def items_w(self, space):
        return space.call_method(self.w_mapping, "items")

    def copy_w(self, space):
        return space.call_method(self.w_mapping, "copy")

    def descr_reversed(self, space):
        return space.call_method(self.w_mapping, "__reversed__")

cmp_methods = {}
def make_cmp_method(op):
    def descr_op(self, space, w_other):
        return getattr(space, op)(self.w_mapping, w_other)
    descr_name = 'descr_' + op
    descr_op.__name__ = descr_name
    setattr(W_DictProxyObject, descr_name, descr_op)
    cmp_methods['__%s__' % op] = interp2app(getattr(W_DictProxyObject, descr_name))

for op in ['eq', 'ne', 'gt', 'ge', 'lt', 'le']:
    make_cmp_method(op)


W_DictProxyObject.typedef = TypeDef(
    'mappingproxy',
    __new__=interp2app(W_DictProxyObject.descr_new),
    __init__=interp2app(W_DictProxyObject.descr_init),
    __len__=interp2app(W_DictProxyObject.descr_len),
    __getitem__=interp2app(W_DictProxyObject.descr_getitem),
    __contains__=interp2app(W_DictProxyObject.descr_contains),
    __iter__=interp2app(W_DictProxyObject.descr_iter),
    __str__=interp2app(W_DictProxyObject.descr_str),
    __repr__=interp2app(W_DictProxyObject.descr_repr),
    __or__=interp2app(W_DictProxyObject.descr_or),
    __ror__=interp2app(W_DictProxyObject.descr_ror),
    __ior__=interp2app(W_DictProxyObject.descr_ior),
    __reversed__ = interp2app(W_DictProxyObject.descr_reversed),
    __class_getitem__ = interp2app(
        generic_alias_class_getitem, as_classmethod=True),
    get=interp2app(W_DictProxyObject.get_w),
    keys=interp2app(W_DictProxyObject.keys_w),
    values=interp2app(W_DictProxyObject.values_w),
    items=interp2app(W_DictProxyObject.items_w),
    copy=interp2app(W_DictProxyObject.copy_w),
    **cmp_methods
)

def _set_flag_map_or_seq(space):
    w_type = space.gettypeobject(W_DictProxyObject.typedef)
    w_type.flag_map_or_seq = 'M'