diff --git a/pybamm/expression_tree/binary_operators.py b/pybamm/expression_tree/binary_operators.py
index 890b01e7..78cfee5b 100644
--- a/pybamm/expression_tree/binary_operators.py
+++ b/pybamm/expression_tree/binary_operators.py
@@ -5,6 +5,8 @@ from __future__ import absolute_import, division
 from __future__ import print_function, unicode_literals
 import pybamm
 
+import numbers
+
 
 class BinaryOperator(pybamm.Symbol):
     """A node in the expression tree representing a binary operator (e.g. `+`, `*`)
@@ -18,14 +20,27 @@ class BinaryOperator(pybamm.Symbol):
 
     name : str
         name of the node
-    left : :class:`Symbol`
-        lhs child node
-    right : :class:`Symbol`
-        rhs child node
+    left : :class:`Symbol` or :class:`Number`
+        lhs child node (converted to :class:`Scalar` if Number)
+    right : :class:`Symbol` or :class:`Number`
+        rhs child node (converted to :class:`Scalar` if Number)
 
     """
 
     def __init__(self, name, left, right):
+        assert isinstance(left, (pybamm.Symbol, numbers.Number)) and isinstance(
+            right, (pybamm.Symbol, numbers.Number)
+        ), TypeError(
+            """left and right must both be Symbols or Numbers
+                but they are {} and {}""".format(
+                type(left), type(right)
+            )
+        )
+        if isinstance(left, numbers.Number):
+            left = pybamm.Scalar(left)
+        if isinstance(right, numbers.Number):
+            right = pybamm.Scalar(right)
+
         super().__init__(name, children=[left, right])
 
     def __str__(self):
@@ -45,7 +60,7 @@ class Power(BinaryOperator):
 
     def evaluate(self, t=None, y=None):
         """ See :meth:`pybamm.Symbol.evaluate()`. """
-        return self.children[0].evaluate(t, y)**self.children[1].evaluate(t, y)
+        return self.children[0].evaluate(t, y) ** self.children[1].evaluate(t, y)
 
 
 class Addition(BinaryOperator):
diff --git a/pybamm/expression_tree/symbol.py b/pybamm/expression_tree/symbol.py
index 79491358..0c9a93b5 100644
--- a/pybamm/expression_tree/symbol.py
+++ b/pybamm/expression_tree/symbol.py
@@ -4,7 +4,9 @@
 from __future__ import absolute_import, division
 from __future__ import print_function, unicode_literals
 import pybamm
+
 import anytree
+import numbers
 import copy
 
 
@@ -81,37 +83,88 @@ class Symbol(anytree.NodeMixin):
 
     def __repr__(self):
         """returns the string `__class__(id, name, parent expression)`"""
-        return "{!s}({}, {!s}, {!s})".format(self.__class__.__name__,
-                                             hex(self.id), self._name, self.parent)
+        return "{!s}({}, {!s}, {!s})".format(
+            self.__class__.__name__, hex(self.id), self._name, self.parent
+        )
 
     def __add__(self, other):
         """return an :class:`Addition` object"""
-        if isinstance(other, Symbol):
+        if isinstance(other, (Symbol, numbers.Number)):
             return pybamm.Addition(self, other)
         else:
             raise NotImplementedError
 
+    def __radd__(self, other):
+        """return an :class:`Addition` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Addition(other, self)
+        else:
+            raise NotImplementedError
+
     def __sub__(self, other):
-        """return an :class:`Subtraction` object"""
-        if isinstance(other, Symbol):
+        """return a :class:`Subtraction` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
             return pybamm.Subtraction(self, other)
         else:
             raise NotImplementedError
 
+    def __rsub__(self, other):
+        """return a :class:`Subtraction` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Subtraction(other, self)
+        else:
+            raise NotImplementedError
+
     def __mul__(self, other):
-        """return an :class:`Multiplication` object"""
-        if isinstance(other, Symbol):
+        """return a :class:`Multiplication` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
             return pybamm.Multiplication(self, other)
         else:
             raise NotImplementedError
 
+    def __rmul__(self, other):
+        """return a :class:`Multiplication` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Multiplication(other, self)
+        else:
+            raise NotImplementedError
+
     def __truediv__(self, other):
-        """return an :class:`Division` object"""
-        if isinstance(other, Symbol):
+        """return a :class:`Division` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
             return pybamm.Division(self, other)
         else:
             raise NotImplementedError
 
+    def __rtruediv__(self, other):
+        """return a :class:`Division` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Division(other, self)
+        else:
+            raise NotImplementedError
+
+    def __pow__(self, other):
+        """return a :class:`Power` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Power(self, other)
+        else:
+            raise NotImplementedError
+
+    def __rpow__(self, other):
+        """return a :class:`Power` object"""
+        if isinstance(other, (Symbol, numbers.Number)):
+            return pybamm.Power(other, self)
+        else:
+            raise NotImplementedError
+
+    def __neg__(self):
+        """return a :class:`Negate` object"""
+        return pybamm.Negate(self)
+
+    def __abs__(self):
+        """return an :class:`AbsoluteValue` object"""
+        return pybamm.AbsoluteValue(self)
+
     def evaluate(self, t=None, y=None):
         """evaluate expression tree
 
diff --git a/pybamm/expression_tree/unary_operators.py b/pybamm/expression_tree/unary_operators.py
index 926cdc90..a0a729f4 100644
--- a/pybamm/expression_tree/unary_operators.py
+++ b/pybamm/expression_tree/unary_operators.py
@@ -90,7 +90,6 @@ class SpatialOperator(UnaryOperator):
 
     def __init__(self, name, child):
         super().__init__(name, child)
-        # self.domain = child.domain
 
 
 class Gradient(SpatialOperator):

overloaded binary operators on `Symbol` take numbers
see #36. It might be useful for the overloaded binary operators on`Symbol` (e.g. `__mul__`) be able to take `Numbers` (e.g. `int'). They would then implicitly convert this to a `Scalar` node.

Note: also need to add `__pow__` to this list.
diff --git a/tests/test_discretisations/test_base_discretisations.py b/tests/test_discretisations/test_base_discretisations.py
index a8044d8f..e2f873d5 100644
--- a/tests/test_discretisations/test_base_discretisations.py
+++ b/tests/test_discretisations/test_base_discretisations.py
@@ -71,30 +71,38 @@ class TestDiscretise(unittest.TestCase):
         # variable
         var = pybamm.Variable("var")
         y_slices = {var.id: slice(53)}
-        var_disc = disc.process_symbol(var, None, y_slices, None)
+        var_disc = disc.process_symbol(var, None, y_slices)
         self.assertTrue(isinstance(var_disc, pybamm.StateVector))
         self.assertEqual(var_disc._y_slice, y_slices[var.id])
         # scalar
         scal = pybamm.Scalar(5)
-        scal_disc = disc.process_symbol(scal, None, None, None)
+        scal_disc = disc.process_symbol(scal, None)
         self.assertTrue(isinstance(scal_disc, pybamm.Scalar))
         self.assertEqual(scal_disc.value, scal.value)
 
         # parameter
         par = pybamm.Parameter("par")
-        par_disc = disc.process_symbol(par, None, None, None)
+        par_disc = disc.process_symbol(par, None)
         self.assertTrue(isinstance(par_disc, pybamm.Parameter))
         self.assertEqual(par_disc.name, par.name)
 
         # binary operator
         bin = var + scal
-        bin_disc = disc.process_symbol(bin, None, y_slices, None)
+        bin_disc = disc.process_symbol(bin, None, y_slices)
         self.assertTrue(isinstance(bin_disc, pybamm.Addition))
         self.assertTrue(isinstance(bin_disc.children[0], pybamm.StateVector))
         self.assertTrue(isinstance(bin_disc.children[1], pybamm.Scalar))
 
         # non-spatial unary operator
-        # TODO: none of these implemented yet
+        un1 = -var
+        un1_disc = disc.process_symbol(un1, None, y_slices)
+        self.assertTrue(isinstance(un1_disc, pybamm.Negate))
+        self.assertTrue(isinstance(un1_disc.children[0], pybamm.StateVector))
+
+        un2 = abs(scal)
+        un2_disc = disc.process_symbol(un2, None)
+        self.assertTrue(isinstance(un2_disc, pybamm.AbsoluteValue))
+        self.assertTrue(isinstance(un2_disc.children[0], pybamm.Scalar))
 
     def test_process_complex_expression(self):
         var1 = pybamm.Variable("var1")
@@ -151,7 +159,7 @@ class TestDiscretise(unittest.TestCase):
             self.assertTrue(isinstance(eqn_disc.children[1], pybamm.StateVector))
 
             y = mesh["whole cell"].nodes ** 2
-            var_disc = disc.process_symbol(var, None, y_slices, None)
+            var_disc = disc.process_symbol(var, None, y_slices)
             # grad and var are identity operators here (for testing purposes)
             np.testing.assert_array_equal(
                 eqn_disc.evaluate(None, y), var_disc.evaluate(None, y)
diff --git a/tests/test_expression_tree/test_binary_operators.py b/tests/test_expression_tree/test_binary_operators.py
index 716a1786..fb0c00d8 100644
--- a/tests/test_expression_tree/test_binary_operators.py
+++ b/tests/test_expression_tree/test_binary_operators.py
@@ -58,6 +58,12 @@ class TestBinaryOperators(unittest.TestCase):
         bin5 = pybamm.BinaryOperator("test", a, d)
         self.assertNotEqual(bin1.id, bin5.id)
 
+    def test_number_overloading(self):
+        a = pybamm.Scalar(4)
+        prod = a * 3
+        self.assertTrue(isinstance(prod.children[1], pybamm.Scalar))
+        self.assertEqual(prod.evaluate(), 12)
+
 
 if __name__ == "__main__":
     print("Add -v for more debug output")
diff --git a/tests/test_expression_tree/test_symbol.py b/tests/test_expression_tree/test_symbol.py
index ac9df67d..b787d7f7 100644
--- a/tests/test_expression_tree/test_symbol.py
+++ b/tests/test_expression_tree/test_symbol.py
@@ -18,18 +18,57 @@ class TestSymbol(unittest.TestCase):
         a = pybamm.Symbol("a")
         b = pybamm.Symbol("b")
 
-        self.assertTrue(isinstance(a + b, pybamm.Symbol))
-        self.assertTrue(isinstance(a - b, pybamm.Symbol))
-        self.assertTrue(isinstance(a * b, pybamm.Symbol))
-        self.assertTrue(isinstance(a / b, pybamm.Symbol))
+        # unary
+        self.assertTrue(isinstance(-a, pybamm.Negate))
+        self.assertTrue(isinstance(abs(a), pybamm.AbsoluteValue))
+
+        # binary - two symbols
+        self.assertTrue(isinstance(a + b, pybamm.Addition))
+        self.assertTrue(isinstance(a - b, pybamm.Subtraction))
+        self.assertTrue(isinstance(a * b, pybamm.Multiplication))
+        self.assertTrue(isinstance(a / b, pybamm.Division))
+        self.assertTrue(isinstance(a ** b, pybamm.Power))
+
+        # binary - symbol and number
+        self.assertTrue(isinstance(a + 2, pybamm.Addition))
+        self.assertTrue(isinstance(a - 2, pybamm.Subtraction))
+        self.assertTrue(isinstance(a * 2, pybamm.Multiplication))
+        self.assertTrue(isinstance(a / 2, pybamm.Division))
+        self.assertTrue(isinstance(a ** 2, pybamm.Power))
+
+        # binary - number and symbol
+        self.assertTrue(isinstance(3 + b, pybamm.Addition))
+        self.assertEqual((3 + b).children[1].id, b.id)
+        self.assertTrue(isinstance(3 - b, pybamm.Subtraction))
+        self.assertEqual((3 - b).children[1].id, b.id)
+        self.assertTrue(isinstance(3 * b, pybamm.Multiplication))
+        self.assertEqual((3 * b).children[1].id, b.id)
+        self.assertTrue(isinstance(3 / b, pybamm.Division))
+        self.assertEqual((3 / b).children[1].id, b.id)
+        self.assertTrue(isinstance(3 ** b, pybamm.Power))
+        self.assertEqual((3 ** b).children[1].id, b.id)
+
+        # error raising
+        with self.assertRaises(NotImplementedError):
+            a + "two"
+        with self.assertRaises(NotImplementedError):
+            a - "two"
+        with self.assertRaises(NotImplementedError):
+            a * "two"
+        with self.assertRaises(NotImplementedError):
+            a / "two"
+        with self.assertRaises(NotImplementedError):
+            a ** "two"
+        with self.assertRaises(NotImplementedError):
+            "two" + a
         with self.assertRaises(NotImplementedError):
-            a + 2
+            "two" - a
         with self.assertRaises(NotImplementedError):
-            a - 2
+            "two" * a
         with self.assertRaises(NotImplementedError):
-            a * 2
+            "two" / a
         with self.assertRaises(NotImplementedError):
-            a / 2
+            "two" ** a
 
     def test_multiple_symbols(self):
         a = pybamm.Symbol("a")
diff --git a/tests/test_expression_tree/test_unary_operators.py b/tests/test_expression_tree/test_unary_operators.py
index 2f92ae6c..fcf0952b 100644
--- a/tests/test_expression_tree/test_unary_operators.py
+++ b/tests/test_expression_tree/test_unary_operators.py
@@ -39,8 +39,9 @@ class TestUnaryOperators(unittest.TestCase):
         grad = pybamm.Gradient(a)
         self.assertEqual(grad.children[0].name, a.name)
 
-    def test_gradient_printing(self):
+    def test_printing(self):
         a = pybamm.Symbol("a")
+        self.assertEqual(str(-a), "-a")
         grad = pybamm.Gradient(a)
         self.assertEqual(grad.name, "grad")
         self.assertEqual(str(grad), "grad(a)")

pip install -e .[dev,docs]
parse_log_pytest
requirements.txt
pytest
3.6
requirements.txt requirements-dev.txt requirements-docs.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
anyio==3.6.2
anytree==2.8.0
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
async-generator==1.10
attrs==22.2.0
Babel==2.11.0
backcall==0.2.0
bleach==4.1.0
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
comm==0.1.4
contextvars==2.4
cycler==0.11.0
dataclasses==0.8
decorator==5.1.1
defusedxml==0.7.1
docutils==0.18.1
entrypoints==0.4
flake8==3.9.2
guzzle-sphinx-theme==0.7.11
idna==3.10
imagesize==1.4.1
immutables==0.19
importlib-metadata==4.8.3
iniconfig==1.1.1
ipykernel==5.5.6
ipython==7.16.3
ipython-genutils==0.2.0
ipywidgets==7.8.5
jedi==0.17.2
Jinja2==3.0.3
json5==0.9.16
jsonschema==3.2.0
jupyter==1.1.1
jupyter-client==7.1.2
jupyter-console==6.4.3
jupyter-core==4.9.2
jupyter-server==1.13.1
jupyterlab==3.2.9
jupyterlab-pygments==0.1.2
jupyterlab-server==2.10.3
jupyterlab_widgets==1.1.11
kiwisolver==1.3.1
MarkupSafe==2.0.1
matplotlib==3.3.4
mccabe==0.6.1
mistune==0.8.4
nbclassic==0.3.5
nbclient==0.5.9
nbconvert==6.0.7
nbformat==5.1.3
nest-asyncio==1.6.0
notebook==6.4.10
numpy==1.19.5
packaging==21.3
pandas==1.1.5
pandocfilters==1.5.1
parso==0.7.1
pexpect==4.9.0
pickleshare==0.7.5
Pillow==8.4.0
pluggy==1.0.0
prometheus-client==0.17.1
prompt-toolkit==3.0.36
ptyprocess==0.7.0
py==1.11.0
-e git+https://github.com/tinosulzer/PyBaMM.git@4a9d29a6bbdb1ca8cabc14c7d99cb6b3792f0187#egg=pybamm
pycodestyle==2.7.0
pycparser==2.21
pyflakes==2.3.1
Pygments==2.14.0
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
pyzmq==25.1.2
requests==2.27.1
scipy==1.5.4
Send2Trash==1.8.3
six==1.17.0
sniffio==1.2.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
terminado==0.12.1
testpath==0.6.0
tomli==1.2.3
tornado==6.1
traitlets==4.3.3
typing_extensions==4.1.1
urllib3==1.26.20
wcwidth==0.2.13
webencodings==0.5.1
websocket-client==1.3.1
widgetsnbextension==3.6.10
zipp==3.6.0

name: PyBaMM
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - anyio==3.6.2
      - anytree==2.8.0
      - argon2-cffi==21.3.0
      - argon2-cffi-bindings==21.2.0
      - async-generator==1.10
      - attrs==22.2.0
      - babel==2.11.0
      - backcall==0.2.0
      - bleach==4.1.0
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - comm==0.1.4
      - contextvars==2.4
      - cycler==0.11.0
      - dataclasses==0.8
      - decorator==5.1.1
      - defusedxml==0.7.1
      - docutils==0.18.1
      - entrypoints==0.4
      - flake8==3.9.2
      - guzzle-sphinx-theme==0.7.11
      - idna==3.10
      - imagesize==1.4.1
      - immutables==0.19
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - ipykernel==5.5.6
      - ipython==7.16.3
      - ipython-genutils==0.2.0
      - ipywidgets==7.8.5
      - jedi==0.17.2
      - jinja2==3.0.3
      - json5==0.9.16
      - jsonschema==3.2.0
      - jupyter==1.1.1
      - jupyter-client==7.1.2
      - jupyter-console==6.4.3
      - jupyter-core==4.9.2
      - jupyter-server==1.13.1
      - jupyterlab==3.2.9
      - jupyterlab-pygments==0.1.2
      - jupyterlab-server==2.10.3
      - jupyterlab-widgets==1.1.11
      - kiwisolver==1.3.1
      - markupsafe==2.0.1
      - matplotlib==3.3.4
      - mccabe==0.6.1
      - mistune==0.8.4
      - nbclassic==0.3.5
      - nbclient==0.5.9
      - nbconvert==6.0.7
      - nbformat==5.1.3
      - nest-asyncio==1.6.0
      - notebook==6.4.10
      - numpy==1.19.5
      - packaging==21.3
      - pandas==1.1.5
      - pandocfilters==1.5.1
      - parso==0.7.1
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - pillow==8.4.0
      - pluggy==1.0.0
      - prometheus-client==0.17.1
      - prompt-toolkit==3.0.36
      - ptyprocess==0.7.0
      - py==1.11.0
      - pycodestyle==2.7.0
      - pycparser==2.21
      - pyflakes==2.3.1
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyzmq==25.1.2
      - requests==2.27.1
      - scipy==1.5.4
      - send2trash==1.8.3
      - six==1.17.0
      - sniffio==1.2.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - terminado==0.12.1
      - testpath==0.6.0
      - tomli==1.2.3
      - tornado==6.1
      - traitlets==4.3.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - wcwidth==0.2.13
      - webencodings==0.5.1
      - websocket-client==1.3.1
      - widgetsnbextension==3.6.10
      - zipp==3.6.0
prefix: /opt/conda/envs/PyBaMM

tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_process_symbol_base tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_number_overloading tests/test_expression_tree/test_symbol.py::TestSymbol::test_symbol_methods tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_printing
tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_concatenation tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_core_NotImplementedErrors tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_discretise_slicing tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_discretise_spatial_operator tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_process_complex_expression tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_process_initial_conditions tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_process_model tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_process_rhs tests/test_discretisations/test_base_discretisations.py::TestDiscretise::test_scalar_to_vector tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_addition tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_addition_printing tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_binary_operator tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_id tests/test_expression_tree/test_binary_operators.py::TestBinaryOperators::test_power tests/test_expression_tree/test_symbol.py::TestSymbol::test_multiple_symbols tests/test_expression_tree/test_symbol.py::TestSymbol::test_symbol_evaluation tests/test_expression_tree/test_symbol.py::TestSymbol::test_symbol_init tests/test_expression_tree/test_symbol.py::TestSymbol::test_symbol_repr tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_absolute tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_gradient tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_id tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_negation tests/test_expression_tree/test_unary_operators.py::TestUnaryOperators::test_unary_operator
pybamm/expression_tree/unary_operators.py pybamm/expression_tree/binary_operators.py pybamm/expression_tree/symbol.py
pybamm/expression_tree/unary_operators.py pybamm/expression_tree/binary_operators.py pybamm/expression_tree/symbol.py