From 2eeb6e78f6f308817fddefa1d8b4ef02deea49cc Mon Sep 17 00:00:00 2001 From: Richard Frank Date: Wed, 20 Jan 2016 06:53:07 -0500 Subject: [PATCH] BUG: Enable comparison of an Asset to an int64 on 32-bit python We use a number of mappings keyed by int64, which otherwise raised KeyErrors for Assets. --- tests/test_assets.py | 12 ++++++++++-- zipline/assets/_assets.pyx | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/test_assets.py b/tests/test_assets.py index 11b92d31..1f90f5ff 100644 --- a/tests/test_assets.py +++ b/tests/test_assets.py @@ -29,7 +29,7 @@ from pandas.tseries.tools import normalize_date from pandas.util.testing import assert_frame_equal from nose_parameterized import parameterized -from numpy import full +from numpy import full, int32, int64 import sqlalchemy as sa from zipline.assets import ( @@ -39,7 +39,7 @@ from zipline.assets import ( AssetFinder, AssetFinderCachedEquities, ) -from six import itervalues +from six import itervalues, integer_types from toolz import valmap from zipline.assets.futures import ( @@ -212,6 +212,14 @@ class AssetTestCase(TestCase): self.assertEqual(s_23, s_23) self.assertEqual(s_23, 23) self.assertEqual(23, s_23) + self.assertEqual(int32(23), s_23) + self.assertEqual(int64(23), s_23) + self.assertEqual(s_23, int32(23)) + self.assertEqual(s_23, int64(23)) + # Check all int types (includes long on py2): + for int_type in integer_types: + self.assertEqual(int_type(23), s_23) + self.assertEqual(s_23, int_type(23)) self.assertNotEqual(s_23, s_24) self.assertNotEqual(s_23, 24) diff --git a/zipline/assets/_assets.pyx b/zipline/assets/_assets.pyx index fbac1d86..9ba13577 100644 --- a/zipline/assets/_assets.pyx +++ b/zipline/assets/_assets.pyx @@ -19,6 +19,8 @@ Cythonized Asset object. """ cimport cython +from numbers import Integral + import numpy as np import warnings cimport numpy as np @@ -86,14 +88,20 @@ cdef class Asset: if isinstance(x, Asset): x_as_int = x.sid elif isinstance(x, int): + # ints are Integral, but much faster to special case x_as_int = x + elif isinstance(x, (long, np.int64, np.int32, Integral)): + x_as_int = int(x) else: return NotImplemented if isinstance(y, Asset): y_as_int = y.sid elif isinstance(y, int): + # ints are Integral, but much faster to special case y_as_int = y + elif isinstance(y, (long, np.int64, np.int32, Integral)): + y_as_int = int(y) else: return NotImplemented