Local object.
| 113 | |
| 114 | |
| 115 | class Local: |
| 116 | """Local object.""" |
| 117 | |
| 118 | __slots__ = ('__storage__', '__ident_func__') |
| 119 | |
| 120 | def __init__(self): |
| 121 | object.__setattr__(self, '__storage__', {}) |
| 122 | object.__setattr__(self, '__ident_func__', get_ident) |
| 123 | |
| 124 | def __iter__(self): |
| 125 | return iter(self.__storage__.items()) |
| 126 | |
| 127 | def __call__(self, proxy): |
| 128 | """Create a proxy for a name.""" |
| 129 | return Proxy(self, proxy) |
| 130 | |
| 131 | def __release_local__(self): |
| 132 | self.__storage__.pop(self.__ident_func__(), None) |
| 133 | |
| 134 | def __getattr__(self, name): |
| 135 | try: |
| 136 | return self.__storage__[self.__ident_func__()][name] |
| 137 | except KeyError: |
| 138 | raise AttributeError(name) |
| 139 | |
| 140 | def __setattr__(self, name, value): |
| 141 | ident = self.__ident_func__() |
| 142 | storage = self.__storage__ |
| 143 | try: |
| 144 | storage[ident][name] = value |
| 145 | except KeyError: |
| 146 | storage[ident] = {name: value} |
| 147 | |
| 148 | def __delattr__(self, name): |
| 149 | try: |
| 150 | del self.__storage__[self.__ident_func__()][name] |
| 151 | except KeyError: |
| 152 | raise AttributeError(name) |
| 153 | |
| 154 | |
| 155 | class _LocalStack: |