ENH: bundle inspect.isclass to avoid paying the cost of inspect import.

This commit is contained in:
David Cournapeau 2016-04-01 18:05:01 +01:00
parent 871bb64cc0
commit dbaba50e68
3 changed files with 12 additions and 6 deletions

View File

@ -8,6 +8,11 @@ PY2 = sys.version_info[0] == 2
if PY2: 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 is used in exceptions, repr(int) is different on Python 2 and 3.
TYPE = "type" TYPE = "type"
@ -20,6 +25,9 @@ if PY2:
def iterkeys(d): def iterkeys(d):
return d.iterkeys() return d.iterkeys()
else: else:
def isclass(klass):
return isinstance(klass, type)
TYPE = "class" TYPE = "class"
def exec_(code, locals_, globals_): def exec_(code, locals_, globals_):

View File

@ -2,10 +2,9 @@ from __future__ import absolute_import, division, print_function
import copy import copy
import hashlib import hashlib
import inspect
import linecache import linecache
from ._compat import exec_, iteritems, iterkeys from ._compat import exec_, iteritems, isclass, iterkeys
from . import _config from . import _config
@ -411,7 +410,7 @@ def fields(cl):
:rtype: tuple of :class:`attr.Attribute` :rtype: tuple of :class:`attr.Attribute`
""" """
if not inspect.isclass(cl): if not isclass(cl):
raise TypeError("Passed object must be a class.") raise TypeError("Passed object must be a class.")
attrs = getattr(cl, "__attrs_attrs__", None) attrs = getattr(cl, "__attrs_attrs__", None)
if attrs is None: if attrs is None:

View File

@ -4,8 +4,7 @@ Commonly useful filters for :func:`attr.asdict`.
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
import inspect from ._compat import isclass
from ._make import Attribute from ._make import Attribute
@ -14,7 +13,7 @@ def _split_what(what):
Returns a tuple of `frozenset`s of classes and attributes. Returns a tuple of `frozenset`s of classes and attributes.
""" """
return ( 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)), frozenset(cl for cl in what if isinstance(cl, Attribute)),
) )