From b0243c984ecc41543db9d871a76105c857946157 Mon Sep 17 00:00:00 2001 From: Robert Smallshire Date: Wed, 6 May 2015 09:54:14 +0200 Subject: [PATCH] Reimplements Header.__init__() to be almost twice as fast. --- segpy/header.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/segpy/header.py b/segpy/header.py index 7eb9e18..6219401 100644 --- a/segpy/header.py +++ b/segpy/header.py @@ -10,11 +10,14 @@ class Header: """An abstract base class for header format definitions.""" def __init__(self, **kwargs): - # TODO: This has terrible performance - better to handle validation optimistically by overriding __getattr__() for keyword, arg in kwargs.items(): - if keyword not in self.ordered_field_names(): - raise TypeError("{!r} is not a recognised field name for {!r}".format(keyword, self.__class__.__name__)) - setattr(self, keyword, arg) + try: + getattr(self, keyword) + except AttributeError as e: + raise TypeError("{!r} is not a recognised field name for {!r}" + .format(keyword, self.__class__.__name__)) from e + else: + setattr(self, keyword, arg) _ordered_field_names = tuple() @@ -31,6 +34,9 @@ class Header: return cls._ordered_field_names return super_class(cls).ordered_field_names() + cls._ordered_field_names + def __getattr__(self, name): + raise AttributeError("Object of type {!r} has no attribute {!r}".format(self.__class__.__name__, name)) + class FormatMeta(type): """A metaclass for header format classes.