Thanks to class Expression, one may execute arbitrary Python expressions, however, it is often necessary to import modules or use existing objects (in particular functions), which is not possible from within expressions.

To address this need, every instance of PetriNet is equipped with an attribute globalise that holds a dict-like object used as the context for evaluating the expressions embedded in the net and its components. Consider for example, a net in which we use a guard that needs constant math.pi:

>>> from snakes.nets import *
>>> net = PetriNet("my net")
>>> trans = Transition("t", Expression("math.pi > 3"))
>>> net.add_transition(trans)
>>> net.add_place(Place("p", [dot]))
>>> net.add_input("p", "t", Value(dot))
>>> trans.modes()
Traceback (most recent call last):
  ...
NameError: name 'math' is not defined

(Note that we add a place and an input arc because disconnected transitions in SNAKES have no modes at all so that trans.modes() would return [] without even trying to evaluate the guard.) Because module math is not imported, we have a NameError. But importing math will not solve the problem because we do it in the context of your Python shell but not in that of the net:

>>> import math
>>> trans.modes()
Traceback (most recent call last):
  ...
NameError: name 'math' is not defined

The solution is to execute statement import math in the context of globals as follows:

>>> net.globals.declare("import math")
>>> trans.modes()
[Substitution()]

Method net.globals.declare expects a Python statement that is exec-ed in the context of the dict-like net.globals. So our import math now has an effect that is remembered for all the evaluations that will take place within the net. Because net.globals is a dict-like structure, it is also possible to assign keys directly to objects.

>>> bis = Transition("b", Expression("math.pi > THREE"))
>>> net.add_transition(bis)
>>> net.add_input("p", "b", Value(dot))
>>> bis.modes()
Traceback (most recent call last):
  ...
NameError: name 'THREE' is not defined
>>> net.globals["THREE"] = 3
>>> bis.modes()
[Substitution()]