B
W�A[�
� @ s d dl Z d dlZddd�ZdS )� N� � ImmutableFc
s� t � tj�r� �dd��� � � fdd�}d}tjdk rBdj|d�}d �d
d� � D ��}dj||rhd
| nd|� ||d�}|r�t |� ddl
m} t|dd�}yt�
||� W n4 tk
r� } zt| jd | ��W dd} ~ X Y nX || S )a�
Produces a class that either can be used standalone or as a base class for persistent classes.
This is a thin wrapper around a named tuple.
Constructing a type and using it to instantiate objects:
>>> Point = immutable('x, y', name='Point')
>>> p = Point(1, 2)
>>> p2 = p.set(x=3)
>>> p
Point(x=1, y=2)
>>> p2
Point(x=3, y=2)
Inheriting from a constructed type. In this case no type name needs to be supplied:
>>> class PositivePoint(immutable('x, y')):
... __slots__ = tuple()
... def __new__(cls, x, y):
... if x > 0 and y > 0:
... return super(PositivePoint, cls).__new__(cls, x, y)
... raise Exception('Coordinates must be positive!')
...
>>> p = PositivePoint(1, 2)
>>> p.set(x=3)
PositivePoint(x=3, y=2)
>>> p.set(y=-3)
Traceback (most recent call last):
Exception: Coordinates must be positive!
The persistent class also supports the notion of frozen members. The value of a frozen member
cannot be updated. For example it could be used to implement an ID that should remain the same
over time. A frozen member is denoted by a trailing underscore.
>>> Point = immutable('x, y, id_', name='Point')
>>> p = Point(1, 2, id_=17)
>>> p.set(x=3)
Point(x=3, y=2, id_=17)
>>> p.set(id_=18)
Traceback (most recent call last):
AttributeError: Cannot set frozen members id_
�,� c s( dd� � D �} | r$dj d�| �d�S dS )Nc S s g | ]}|� d �rd| �qS )�_z'%s')�endswith)�.0�f� r
�H/opt/alt/python37/lib64/python3.7/site-packages/pyrsistent/_immutable.py�