Your IP : 52.15.172.207
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�
<listcomp>7 s z9immutable.<locals>.frozen_member_test.<locals>.<listcomp>z�
frozen_fields = fields_to_modify & set([{frozen_members}])
if frozen_fields:
raise AttributeError('Cannot set frozen members %s' % ', '.join(frozen_fields))
z, )�frozen_membersr )�format�join)r
)�membersr
r �frozen_member_test6 s z%immutable.<locals>.frozen_member_testr )� � z, verbose={verbose})�verbosez, c s s | ]}d | V qdS )z'%s'Nr
)r �mr
r
r � <genexpr>F s zimmutable.<locals>.<genexpr>a�
class {class_name}(namedtuple('ImmutableBase', [{quoted_members}]{verbose_string})):
__slots__ = tuple()
def __repr__(self):
return super({class_name}, self).__repr__().replace('ImmutableBase', self.__class__.__name__)
def set(self, **kwargs):
if not kwargs:
return self
fields_to_modify = set(kwargs.keys())
if not fields_to_modify <= {member_set}:
raise AttributeError("'%s' is not a member" % ', '.join(fields_to_modify - {member_set}))
{frozen_member_test}
return self.__class__.__new__(self.__class__, *map(kwargs.pop, [{quoted_members}], self))
z set([%s])zset())�quoted_membersZ
member_setr �verbose_string�
class_namer )�
namedtupleZpyrsistent_immutable)r �__name__z:
N)�
isinstance�six�string_types�replace�split�sys�version_infor r �print�collectionsr �dictZexec_�SyntaxError�message)
r �namer r r r �templater � namespace�er
)r r � immutable s* -
$r, )r r F)r! r r, r
r
r
r �<module> s