Skip to content

Magic Methods and Operators

Signified exposes reactive behavior primarily through magic methods on Signal and Computed.

Unary Methods

Method Usage example Notes
__abs__ >>> from signified import Signal
>>> x = Signal(-5)
>>> abs(x)
<5>
__neg__ >>> from signified import Signal
>>> x = Signal(10)
>>> -x
<-10>
__pos__ >>> from signified import Signal
>>> x = Signal(10)
>>> +x
<10>
__invert__ >>> from signified import Signal
>>> flags = Signal(0b0011)
>>> ~flags
<-4>
Commonly used with bitmasks.
__round__ >>> from signified import Signal
>>> x = Signal(3.14159)
>>> round(x, 2)
<3.14>
__trunc__ >>> import math
>>> from signified import Signal
>>> x = Signal(3.9)
>>> math.trunc(x)
<3>
__floor__ >>> import math
>>> from signified import Signal
>>> x = Signal(3.9)
>>> math.floor(x)
<3>
__ceil__ >>> import math
>>> from signified import Signal
>>> x = Signal(3.1)
>>> math.ceil(x)
<4>
__str__ >>> from signified import Signal
>>> x = Signal(10)
>>> str(x)
'10'
String conversion is not reactive.

Arithmetic and Bitwise Methods

Method Usage example Notes
__add__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a + b
<13>
__sub__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a - b
<7>
__mul__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a * b
<30>
__truediv__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a / b
<3.3333333333333335>
__floordiv__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a // b
<3>
__mod__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a % b
<1>
__pow__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a ** b
<1000>
__divmod__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> divmod(a, b)
<(3, 1)>
__matmul__ >>> import numpy as np
>>> from signified import Signal
>>> left = Signal(np.array([1, 2]))
>>> right = Signal(np.array([1, 1]))
>>> left @ right
<3>
__and__ >>> from signified import Signal
>>> a = Signal(0b1100)
>>> b = Signal(0b1010)
>>> a & b
<8>
__or__ >>> from signified import Signal
>>> a = Signal(0b1100)
>>> b = Signal(0b1010)
>>> a | b
<14>
__xor__ >>> from signified import Signal
>>> a = Signal(0b1100)
>>> b = Signal(0b1010)
>>> a ^ b
<6>
__lshift__ >>> from signified import Signal
>>> x = Signal(10)
>>> x << 1
<20>
__rshift__ >>> from signified import Signal
>>> x = Signal(10)
>>> x >> 1
<5>

Reverse Arithmetic and Bitwise Methods

Method Usage example Notes
__radd__ >>> from signified import Signal
>>> x = Signal(10)
>>> 5 + x
<15>
__rsub__ >>> from signified import Signal
>>> x = Signal(10)
>>> 50 - x
<40>
__rmul__ >>> from signified import Signal
>>> x = Signal(10)
>>> 5 * x
<50>
__rtruediv__ >>> from signified import Signal
>>> x = Signal(10)
>>> 50 / x
<5.0>
__rfloordiv__ >>> from signified import Signal
>>> x = Signal(10)
>>> 50 // x
<5>
__rmod__ >>> from signified import Signal
>>> x = Signal(10)
>>> 50 % x
<0>
__rpow__ >>> from signified import Signal
>>> x = Signal(10)
>>> 2 ** x
<1024>
__rdivmod__ >>> from signified import Signal
>>> x = Signal(10)
>>> divmod(50, x)
<(5, 0)>
__rand__ >>> from signified import Signal
>>> x = Signal(0b0101)
>>> 0b1111 & x
<5>
__ror__ >>> from signified import Signal
>>> x = Signal(0b0101)
>>> 0b1111 | x
<15>
__rxor__ >>> from signified import Signal
>>> x = Signal(0b0101)
>>> 0b1111 ^ x
<10>

Comparisons, Predicates, and Truthiness

Method Usage example Notes
__lt__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a < b
<False>
__le__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a <= b
<False>
__gt__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a > b
<True>
__ge__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a >= b
<True>
__ne__ >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a != b
<True>
eq >>> from signified import Signal
>>> a = Signal(10)
>>> b = Signal(3)
>>> a.eq(b)
<False>
Overloading __eq__ would break the object, so we use an explicit method, a.eq(b) as an analog to a == b.
is_not >>> from signified import Signal
>>> maybe_user = Signal(None)
>>> maybe_user.is_not(None)
<False>
is / is not are not overloadable. Use this for reactive identity-style checks.
contains >>> from signified import Signal
>>> nums = Signal([1, 2, 3])
>>> nums.contains(2)
<True>
where >>> from signified import Signal
>>> flag = Signal(True)
>>> flag.where("yes", "no")
<yes>
as_bool >>> from signified import Signal
>>> x = Signal(10)
>>> x.as_bool()
<True>
__bool__ cannot safely be reactive because Python expects an immediate bool in control flow.

Object and Container Access

Method Usage example Notes
__getattr__ >>> from types import SimpleNamespace
>>> from signified import Signal
>>> person = Signal(SimpleNamespace(name="Alice"))
>>> person.name
<Alice>
__call__ >>> from signified import Signal
>>> fn = Signal(lambda x: x + 1)
>>> fn(10)
<11>
__getitem__ >>> from signified import Signal
>>> Signal([1, 2, 3])[1]
<2>
>>> Signal({"x": 1})["x"]
<1>
__setattr__ >>> from types import SimpleNamespace
>>> from signified import Signal
>>> person = Signal(SimpleNamespace(name="Alice"))
>>> name = person.name
>>> person.name = "Bob"
>>> name
<Bob>
Updates wrapped object attributes and notifies dependents.
__setitem__ >>> from signified import Signal
>>> nums = Signal([1, 2, 3])
>>> first = nums[0]
>>> nums[0] = 10
>>> first
<10>
Works for wrapped list/dict item updates.

Complete API Reference

See Core API for full signatures, overloads, and docstring examples.