Improve hot path performance of is_simple_callable() and get_attribute()

This commit is contained in:
Alexei Ardyakov 2022-01-05 00:27:37 +03:00
parent 5b2abbed25
commit 2387dfcdfc

View File

@ -63,22 +63,25 @@ def is_simple_callable(obj):
""" """
True if the object is a callable that takes no arguments. True if the object is a callable that takes no arguments.
""" """
if not callable(obj):
return False
# Bail early since we cannot inspect built-in function signatures. # Bail early since we cannot inspect built-in function signatures.
if inspect.isbuiltin(obj): if inspect.isbuiltin(obj):
raise BuiltinSignatureError( raise BuiltinSignatureError(
'Built-in function signatures are not inspectable. ' 'Built-in function signatures are not inspectable. '
'Wrap the function call in a simple, pure Python function.') 'Wrap the function call in a simple, pure Python function.')
if not (inspect.isfunction(obj) or inspect.ismethod(obj) or isinstance(obj, functools.partial)): if not (inspect.ismethod(obj) or inspect.isfunction(obj) or isinstance(obj, functools.partial)):
return False return False
sig = inspect.signature(obj) sig = inspect.signature(obj)
params = sig.parameters.values() params = sig.parameters
return all( return not params or all(
param.kind == param.VAR_POSITIONAL or param.kind == param.VAR_POSITIONAL or
param.kind == param.VAR_KEYWORD or param.kind == param.VAR_KEYWORD or
param.default != param.empty param.default != param.empty
for param in params for param in params.values()
) )
@ -91,7 +94,7 @@ def get_attribute(instance, attrs):
""" """
for attr in attrs: for attr in attrs:
try: try:
if isinstance(instance, Mapping): if hasattr(instance, 'items') and isinstance(instance, Mapping):
instance = instance[attr] instance = instance[attr]
else: else:
instance = getattr(instance, attr) instance = getattr(instance, attr)