�
���a�
� � � d dl Z dd�ZdS )� N� � ImmutableFc �V � � t � t � � r(� � dd� � � � � � � fd�}d}t j dk rd� |�� � }d� d � � D � � � � }d
� ||rd|z nd |� � ||�
� � }|rt |� � ddl m
} t |d�� � } t ||� � n5# t $ r(} t t | � � dz |z � � | �d} ~ ww xY w|| 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 �v �� d� �D � � } | r)d� d� | � � �� � S dS )Nc �B � g | ]}|� d � � �d|z ��S )�_�'%s')�endswith)�.0�fs �7/usr/lib/python3/dist-packages/pyrsistent/_immutable.py�
<listcomp>z9immutable.<locals>.frozen_member_test.<locals>.<listcomp>5 s+ � �I�I�I�����C���I�&�1�*�I�I�I� z�
frozen_fields = fields_to_modify & set([{frozen_members}])
if frozen_fields:
raise AttributeError('Cannot set frozen members %s' % ', '.join(frozen_fields))
�, )�frozen_membersr )�format�join)r �memberss �r �frozen_member_testz%immutable.<locals>.frozen_member_test4 sN �� �I�I�g�I�I�I��� A�� ��d�i�i��&?�&?��@�@�
A� �rr r )� � z, verbose={verbose})�verboser c 3 � K � | ] }d |z V � �
dS )r N� )r
�ms r � <genexpr>zimmutable.<locals>.<genexpr>D s& |