diff --git a/src/attr/_compat.py b/src/attr/_compat.py index 392ca203..4328c184 100644 --- a/src/attr/_compat.py +++ b/src/attr/_compat.py @@ -8,6 +8,11 @@ PY2 = sys.version_info[0] == 2 if PY2: + import types + + def isclass(klass): + return isinstance(klass, (type, types.ClassType)) + # TYPE is used in exceptions, repr(int) is different on Python 2 and 3. TYPE = "type" @@ -20,6 +25,9 @@ if PY2: def iterkeys(d): return d.iterkeys() else: + def isclass(klass): + return isinstance(klass, type) + TYPE = "class" def exec_(code, locals_, globals_): diff --git a/src/attr/_make.py b/src/attr/_make.py index 5da44334..cecf06e0 100644 --- a/src/attr/_make.py +++ b/src/attr/_make.py @@ -2,10 +2,9 @@ from __future__ import absolute_import, division, print_function import copy import hashlib -import inspect import linecache -from ._compat import exec_, iteritems, iterkeys +from ._compat import exec_, iteritems, isclass, iterkeys from . import _config @@ -411,7 +410,7 @@ def fields(cl): :rtype: tuple of :class:`attr.Attribute` """ - if not inspect.isclass(cl): + if not isclass(cl): raise TypeError("Passed object must be a class.") attrs = getattr(cl, "__attrs_attrs__", None) if attrs is None: diff --git a/src/attr/filters.py b/src/attr/filters.py index c5faaa37..4e60183d 100644 --- a/src/attr/filters.py +++ b/src/attr/filters.py @@ -4,8 +4,7 @@ Commonly useful filters for :func:`attr.asdict`. from __future__ import absolute_import, division, print_function -import inspect - +from ._compat import isclass from ._make import Attribute @@ -14,7 +13,7 @@ def _split_what(what): Returns a tuple of `frozenset`s of classes and attributes. """ return ( - frozenset(cl for cl in what if inspect.isclass(cl)), + frozenset(cl for cl in what if isclass(cl)), frozenset(cl for cl in what if isinstance(cl, Attribute)), )