docs: def A_multiple_hole_cylinder(Do, L, holes):
      r'''Returns the surface area of a cylinder with multiple holes.
      Calculation will naively return a negative value or other impossible
      result if the number of cylinders added is physically impossible.
      Holes may be of different shapes, but must be perpendicular to the
      axis of the cylinder.
  
      .. math::
          A = \pi D_o L + 2\cdot \frac{\pi D_o^2}{4} +
          \sum_{i}^n \left( \pi D_i L  - 2\cdot \frac{\pi D_i^2}{4}\right)
  
      Parameters
      ----------
      Do : float
          Diameter of the exterior of the cylinder, [m]
      L : float
          Length of the cylinder, [m]
      holes : list
          List of tuples containing (diameter, count) pairs of descriptions for
          each of the holes sizes.
  
      Returns
      -------
      A : float
          Surface area [m^2]
  
      Examples
      --------
      >>> A_multiple_hole_cylinder(0.01, 0.1, [(0.005, 1)])
      0.004830198704894308
      '''
      side_o = pi*Do*L
      cap_circle = pi*Do**2/4*2
      A = cap_circle + side_o
      for Di, n in holes:
          side_i = pi*Di*L
          cap_removed = pi*Di**2/4*2
          A = A + side_i*n - cap_removed*n
      return A