Mutability Cython Implementation

class sage.structure.mutability.Mutability[source]

Bases: object

Class to mix in mutability feature.

EXAMPLES:

sage: class A(SageObject, Mutability):
....:     def __init__(self, val):
....:         self._val = val
....:     def change(self, val):
....:         self._require_mutable()
....:         self._val = val
....:     def __hash__(self):
....:         self._require_immutable()
....:         return hash(self._val)
sage: a = A(4)
sage: a._val
4
sage: a.change(6); a._val
6
sage: hash(a)
Traceback (most recent call last):
...
ValueError: object is mutable; please make it immutable first
sage: a.set_immutable()
sage: a.change(4)
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead
sage: hash(a)
6
>>> from sage.all import *
>>> class A(SageObject, Mutability):
...     def __init__(self, val):
...         self._val = val
...     def change(self, val):
...         self._require_mutable()
...         self._val = val
...     def __hash__(self):
...         self._require_immutable()
...         return hash(self._val)
>>> a = A(Integer(4))
>>> a._val
4
>>> a.change(Integer(6)); a._val
6
>>> hash(a)
Traceback (most recent call last):
...
ValueError: object is mutable; please make it immutable first
>>> a.set_immutable()
>>> a.change(Integer(4))
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead
>>> hash(a)
6
is_immutable()[source]

Return True if this object is immutable (cannot be changed) and False if it is not.

To make this object immutable use self.set_immutable().

EXAMPLES:

sage: v = Sequence([1,2,3,4/5])
sage: v[0] = 5
sage: v
[5, 2, 3, 4/5]
sage: v.is_immutable()
False
sage: v.set_immutable()
sage: v.is_immutable()
True
>>> from sage.all import *
>>> v = Sequence([Integer(1),Integer(2),Integer(3),Integer(4)/Integer(5)])
>>> v[Integer(0)] = Integer(5)
>>> v
[5, 2, 3, 4/5]
>>> v.is_immutable()
False
>>> v.set_immutable()
>>> v.is_immutable()
True
is_mutable()[source]

Return True if this object is mutable (can be changed) and False if it is not.

To make this object immutable use self.set_immutable().

EXAMPLES:

sage: v = Sequence([1,2,3,4/5])
sage: v[0] = 5
sage: v
[5, 2, 3, 4/5]
sage: v.is_mutable()
True
sage: v.set_immutable()
sage: v.is_mutable()
False
>>> from sage.all import *
>>> v = Sequence([Integer(1),Integer(2),Integer(3),Integer(4)/Integer(5)])
>>> v[Integer(0)] = Integer(5)
>>> v
[5, 2, 3, 4/5]
>>> v.is_mutable()
True
>>> v.set_immutable()
>>> v.is_mutable()
False
set_immutable()[source]

Make this object immutable, so it can never again be changed.

EXAMPLES:

sage: v = Sequence([1,2,3,4/5])
sage: v[0] = 5
sage: v
[5, 2, 3, 4/5]
sage: v.set_immutable()
sage: v[3] = 7
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead.
>>> from sage.all import *
>>> v = Sequence([Integer(1),Integer(2),Integer(3),Integer(4)/Integer(5)])
>>> v[Integer(0)] = Integer(5)
>>> v
[5, 2, 3, 4/5]
>>> v.set_immutable()
>>> v[Integer(3)] = Integer(7)
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead.
sage.structure.mutability.require_immutable(f)[source]

A decorator that requires immutability for a method to be called.

Note

Objects whose methods use this decorator should have an attribute _is_immutable. Otherwise, the object is assumed to be mutable.

EXAMPLES:

sage: from sage.structure.mutability import require_mutable, require_immutable
sage: class A():
....:  def __init__(self, val):
....:      self._m = val
....:  @require_mutable
....:  def change(self, new_val):
....:      'change self'
....:      self._m = new_val
....:  @require_immutable
....:  def __hash__(self):
....:      'implement hash'
....:      return hash(self._m)
sage: a = A(5)
sage: a.change(6)
sage: hash(a)   # indirect doctest
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
sage: a._is_immutable = True
sage: hash(a)
6
sage: a.change(7)
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
sage: from sage.misc.sageinspect import sage_getdoc
sage: print(sage_getdoc(a.__hash__))
implement hash
>>> from sage.all import *
>>> from sage.structure.mutability import require_mutable, require_immutable
>>> class A():
...  def __init__(self, val):
...      self._m = val
...  @require_mutable
...  def change(self, new_val):
...      'change self'
...      self._m = new_val
...  @require_immutable
...  def __hash__(self):
...      'implement hash'
...      return hash(self._m)
>>> a = A(Integer(5))
>>> a.change(Integer(6))
>>> hash(a)   # indirect doctest
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
>>> a._is_immutable = True
>>> hash(a)
6
>>> a.change(Integer(7))
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
>>> from sage.misc.sageinspect import sage_getdoc
>>> print(sage_getdoc(a.__hash__))
implement hash

AUTHORS:

sage.structure.mutability.require_mutable(f)[source]

A decorator that requires mutability for a method to be called.

Note

Objects whose methods use this decorator should have an attribute _is_immutable. Otherwise, the object is assumed to be mutable.

EXAMPLES:

sage: from sage.structure.mutability import require_mutable, require_immutable
sage: class A():
....:     def __init__(self, val):
....:         self._m = val
....:     @require_mutable
....:     def change(self, new_val):
....:         'change self'
....:         self._m = new_val
....:     @require_immutable
....:     def __hash__(self):
....:         'implement hash'
....:         return hash(self._m)
sage: a = A(5)
sage: a.change(6)
sage: hash(a)
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
sage: a._is_immutable = True
sage: hash(a)
6
sage: a.change(7)   # indirect doctest
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
sage: from sage.misc.sageinspect import sage_getdoc
sage: print(sage_getdoc(a.change))
change self
>>> from sage.all import *
>>> from sage.structure.mutability import require_mutable, require_immutable
>>> class A():
...     def __init__(self, val):
...         self._m = val
...     @require_mutable
...     def change(self, new_val):
...         'change self'
...         self._m = new_val
...     @require_immutable
...     def __hash__(self):
...         'implement hash'
...         return hash(self._m)
>>> a = A(Integer(5))
>>> a.change(Integer(6))
>>> hash(a)
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is mutable, <function ...__hash__ at ...> must not be called
>>> a._is_immutable = True
>>> hash(a)
6
>>> a.change(Integer(7))   # indirect doctest
Traceback (most recent call last):
...
ValueError: <class '__main__.A'> instance is immutable, <function ...change at ...> must not be called
>>> from sage.misc.sageinspect import sage_getdoc
>>> print(sage_getdoc(a.change))
change self

AUTHORS: