From 7eb1d719ed431e854ad44b48f4902cc27e1803ce Mon Sep 17 00:00:00 2001 From: Eddie Hebert Date: Mon, 8 Sep 2014 11:09:41 -0400 Subject: [PATCH] MAINT: Check attributes instead of contains for event fields. In support of source that emits a subclass of Event which defines some fields as properties instead of doubling the value in the `Event.__dict__` Use hasattr instead of the overridden __contains__ method of the Event class, so that when non-algorithm facing code checks for field existence, properties count. Intentionally not touching the `__contains__` in Event, to avoid changing, at the moment, any algo behavior that relies on the `__contains__` behavior's use of `__dict__` --- tests/test_sources.py | 4 ++-- zipline/transforms/returns.py | 2 +- zipline/transforms/utils.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_sources.py b/tests/test_sources.py index 10ad80ec..506887e1 100644 --- a/tests/test_sources.py +++ b/tests/test_sources.py @@ -53,8 +53,8 @@ class TestDataFrameSource(TestCase): for event in source: self.assertTrue('sid' in event) self.assertTrue('arbitrary' in event) - self.assertTrue('volume' in event) - self.assertTrue('price' in event) + self.assertTrue(hasattr(event, 'volume')) + self.assertTrue(hasattr(event, 'price')) self.assertEquals(event['arbitrary'], 1.) self.assertEquals(event['sid'], 0) self.assertTrue(isinstance(event['volume'], int)) diff --git a/zipline/transforms/returns.py b/zipline/transforms/returns.py index 401a9cda..4a9f750d 100644 --- a/zipline/transforms/returns.py +++ b/zipline/transforms/returns.py @@ -96,7 +96,7 @@ class ReturnsFromPriorClose(object): We only allow events with a price field to be run through the returns transform. """ - if 'price' not in event: + if not hasattr(event, 'price'): raise WrongDataForTransform( transform="ReturnsEventWindow", fields=['price']) diff --git a/zipline/transforms/utils.py b/zipline/transforms/utils.py index fe2bf625..fa4b3f58 100644 --- a/zipline/transforms/utils.py +++ b/zipline/transforms/utils.py @@ -280,7 +280,7 @@ class EventWindow(with_metaclass(ABCMeta)): We only allow events with all of our tracked fields. """ # All events require a 'dt' field. - if 'dt' not in event: + if not hasattr(event, 'dt'): raise WrongDataForTransform( transform=self.__class__.__name__, fields=['dt'],