Options and variants
Options
In SmartPy usage of the value None
is reflected in the type: for example, an optional integer is of type sp.option[sp.int]
. This type is inhabited by None
and by sp.Some(n)
for any value n
of type sp.int
.
x.is_none()
Checks whether the given value is None
. For example None.is_none() == True
and sp.Some(42).is_none() == False
x.is_some()
Checks whether the given value is of the form sp.Some(...)
. For example None.is_some() == False
and sp.Some(42).is_some() == True
.
x.unwrap_some([error])
Extracts the argument of an option value if it is of the form sp.Some(...)
. Raises an exception (that can be specified as error
) if x == None
.
For example, sp.Some(42).unwrap_some() == 42
, whereas None.unwrap_some("oops")
raises the exception "oops"
.
Variants
Variants in SmartPy are enumerations of cases, where each case comes with an extra value. In other languages similar features, such as enums, sum types, and tagged/disjoint unions, exist.
For example, sp.variant(Circle=sp.int, Rectangle=sp.pair[sp.int, sp.int])
is a variant type with two cases. Its values are sp.variant.Circle(r)
(for any r
of type sp.int
) and sp.variant.Rectangle(h, w)
(for any h
and w
of type sp.int
).
x.is_variant.V()
Checks whether a value is of the given variant V
, for example:
c = sp.variant.Circle(2)
assert c.is_variant.Circle()
x.unwrap.V()
Obtains the argument of a given variant V
. Raises an error if it is of a different variant. For example:
c = sp.variant.Circle(2)
assert c.unwrap.Circle() == 2
r = c.unwrap.Rectangle() # raises an exception