code: def _test_expect_types_with_tuple(self):
      @expect_types(a=(int, float))
      def foo(a):
          return a
  
      self.assertEqual(foo(1), 1)
      self.assertEqual(foo(1.0), 1.0)
  
      with self.assertRaises(TypeError) as e:
          foo("1")
  
      expected_message = (
          "{qualname}() expected a value of "
          "type int or float for argument 'a', but got str instead."
      ).format(qualname=qualname(foo))
      self.assertEqual(e.exception.args[0], expected_message)
  
imports: from operator import attrgetter
  from types import FunctionType
  from unittest import TestCase
  from nose_parameterized import parameterized
  from numpy import arange, array, dtype
  import pytz
  from six import PY3
  from catalyst.utils.preprocess import call, preprocess
  from catalyst.utils.input_validation import expect_dimensions, ensure_timezone, expect_element, expect_dtypes, expect_types, optional, optionally
label_desc: Use image node_id 11 for calling the PreprocessTestCase obj's underlying member method code with example usage: obj._test_expect_types_with_tuple() and returns: a