code: def test_expect_dtypes(self):
      @expect_dtypes(a=dtype(float), b=dtype("datetime64[ns]"))
      def foo(a, b, c):
          return a, b, c
  
      good_a = arange(3, dtype=float)
      good_b = arange(3).astype("datetime64[ns]")
      good_c = object()
  
      a_ret, b_ret, c_ret = foo(good_a, good_b, good_c)
      self.assertIs(a_ret, good_a)
      self.assertIs(b_ret, good_b)
      self.assertIs(c_ret, good_c)
  
      with self.assertRaises(TypeError) as e:
          foo(good_a, arange(3, dtype="int64"), good_c)
  
      expected_message = (
          "{qualname}() expected a value with dtype 'datetime64[ns]'"
          " for argument 'b', but got 'int64' instead."
      ).format(qualname=qualname(foo))
      self.assertEqual(e.exception.args[0], expected_message)
  
      with self.assertRaises(TypeError) as e:
          foo(arange(3, dtype="uint32"), good_c, good_c)
  
      expected_message = (
          "{qualname}() expected a value with dtype 'float64'"
          " for argument 'a', but got 'uint32' 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 zipline.utils.preprocess import call, preprocess
  from zipline.utils.input_validation import expect_dimensions, ensure_timezone, expect_element, expect_dtypes, expect_types, optional, optionally
label_desc: Use image node_id 15 for calling the PreprocessTestCase obj's underlying member method code with example usage: obj.test_expect_dtypes() and returns: a,  b,  c