Skip to content

Commit c7ea1e9

Browse files
correctmostjacobtylerwalls
authored andcommitted
Consolidate numpy member transforms to reduce function calls
1 parent f19fc0a commit c7ea1e9

4 files changed

+75
-33
lines changed

astroid/brain/brain_numpy_core_function_base.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import functools
88

99
from astroid.brain.brain_numpy_utils import (
10-
attribute_looks_like_numpy_member,
11-
infer_numpy_member,
10+
attribute_name_looks_like_numpy_member,
11+
infer_numpy_attribute,
1212
)
1313
from astroid.inference_tip import inference_tip
1414
from astroid.manager import AstroidManager
@@ -25,10 +25,11 @@
2525

2626

2727
def register(manager: AstroidManager) -> None:
28-
for func_name, func_src in METHODS_TO_BE_INFERRED.items():
29-
inference_function = functools.partial(infer_numpy_member, func_src)
30-
manager.register_transform(
31-
Attribute,
32-
inference_tip(inference_function),
33-
functools.partial(attribute_looks_like_numpy_member, func_name),
34-
)
28+
manager.register_transform(
29+
Attribute,
30+
inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)),
31+
functools.partial(
32+
attribute_name_looks_like_numpy_member,
33+
frozenset(METHODS_TO_BE_INFERRED.keys()),
34+
),
35+
)

astroid/brain/brain_numpy_core_multiarray.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88

99
from astroid import nodes
1010
from astroid.brain.brain_numpy_utils import (
11-
attribute_looks_like_numpy_member,
12-
infer_numpy_member,
13-
name_looks_like_numpy_member,
11+
attribute_name_looks_like_numpy_member,
12+
infer_numpy_attribute,
13+
infer_numpy_name,
14+
member_name_looks_like_numpy_member,
1415
)
1516
from astroid.brain.helpers import register_module_extender
1617
from astroid.builder import parse
@@ -92,15 +93,15 @@ def register(manager: AstroidManager) -> None:
9293
manager, "numpy.core.multiarray", numpy_core_multiarray_transform
9394
)
9495

95-
for method_name, function_src in METHODS_TO_BE_INFERRED.items():
96-
inference_function = functools.partial(infer_numpy_member, function_src)
97-
manager.register_transform(
98-
Attribute,
99-
inference_tip(inference_function),
100-
functools.partial(attribute_looks_like_numpy_member, method_name),
101-
)
102-
manager.register_transform(
103-
Name,
104-
inference_tip(inference_function),
105-
functools.partial(name_looks_like_numpy_member, method_name),
106-
)
96+
method_names = frozenset(METHODS_TO_BE_INFERRED.keys())
97+
98+
manager.register_transform(
99+
Attribute,
100+
inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)),
101+
functools.partial(attribute_name_looks_like_numpy_member, method_names),
102+
)
103+
manager.register_transform(
104+
Name,
105+
inference_tip(functools.partial(infer_numpy_name, METHODS_TO_BE_INFERRED)),
106+
functools.partial(member_name_looks_like_numpy_member, method_names),
107+
)

astroid/brain/brain_numpy_core_numeric.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
from astroid import nodes
1010
from astroid.brain.brain_numpy_utils import (
11-
attribute_looks_like_numpy_member,
12-
infer_numpy_member,
11+
attribute_name_looks_like_numpy_member,
12+
infer_numpy_attribute,
1313
)
1414
from astroid.brain.helpers import register_module_extender
1515
from astroid.builder import parse
@@ -41,10 +41,11 @@ def register(manager: AstroidManager) -> None:
4141
manager, "numpy.core.numeric", numpy_core_numeric_transform
4242
)
4343

44-
for method_name, function_src in METHODS_TO_BE_INFERRED.items():
45-
inference_function = functools.partial(infer_numpy_member, function_src)
46-
manager.register_transform(
47-
Attribute,
48-
inference_tip(inference_function),
49-
functools.partial(attribute_looks_like_numpy_member, method_name),
50-
)
44+
manager.register_transform(
45+
Attribute,
46+
inference_tip(functools.partial(infer_numpy_attribute, METHODS_TO_BE_INFERRED)),
47+
functools.partial(
48+
attribute_name_looks_like_numpy_member,
49+
frozenset(METHODS_TO_BE_INFERRED.keys()),
50+
),
51+
)

astroid/brain/brain_numpy_utils.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ def _get_numpy_version() -> tuple[str, str, str]:
3434
return ("0", "0", "0")
3535

3636

37+
def infer_numpy_name(
38+
sources: dict[str, str], node: Name, context: InferenceContext | None = None
39+
):
40+
extracted_node = extract_node(sources[node.name])
41+
return extracted_node.infer(context=context)
42+
43+
44+
def infer_numpy_attribute(
45+
sources: dict[str, str], node: Attribute, context: InferenceContext | None = None
46+
):
47+
extracted_node = extract_node(sources[node.attrname])
48+
return extracted_node.infer(context=context)
49+
50+
51+
# TODO: Deprecate and remove this function
3752
def infer_numpy_member(src, node, context: InferenceContext | None = None):
3853
node = extract_node(src)
3954
return node.infer(context=context)
@@ -61,6 +76,29 @@ def _is_a_numpy_module(node: Name) -> bool:
6176
)
6277

6378

79+
def member_name_looks_like_numpy_member(
80+
member_names: frozenset[str], node: Name
81+
) -> bool:
82+
"""
83+
Returns True if the Name node's name matches a member name from numpy
84+
"""
85+
return node.name in member_names and node.root().name.startswith("numpy")
86+
87+
88+
def attribute_name_looks_like_numpy_member(
89+
member_names: frozenset[str], node: Attribute
90+
) -> bool:
91+
"""
92+
Returns True if the Attribute node's name matches a member name from numpy
93+
"""
94+
return (
95+
node.attrname in member_names
96+
and isinstance(node.expr, Name)
97+
and _is_a_numpy_module(node.expr)
98+
)
99+
100+
101+
# TODO: Deprecate and remove this function
64102
def name_looks_like_numpy_member(member_name: str, node: Name) -> bool:
65103
"""
66104
Returns True if the Name is a member of numpy whose
@@ -69,6 +107,7 @@ def name_looks_like_numpy_member(member_name: str, node: Name) -> bool:
69107
return node.name == member_name and node.root().name.startswith("numpy")
70108

71109

110+
# TODO: Deprecate and remove this function
72111
def attribute_looks_like_numpy_member(member_name: str, node: Attribute) -> bool:
73112
"""
74113
Returns True if the Attribute is a member of numpy whose

0 commit comments

Comments
 (0)