KEMBAR78
Allow redefinition of underscore functions (#10811) by sthagen · Pull Request #85 · sthagen/python-mypy · GitHub
Skip to content

Conversation

@sthagen
Copy link
Owner

@sthagen sthagen commented Jul 15, 2021

This PR causes mypy to not show an error if a function named _ is redefined,
as a single underscore is often used as a name for a throwaway function.

This handles the case where _ is used as an alias for gettext by differentiating
between functions that are aliased as _ but defined with another name,
and functions that are defined as _. Overwriting a function named _ is allowed,
but overwriting a function named something else but aliased as _ is not allowed,
which should prevent people from accidentally overwriting gettext after importing it.

This also turns calling a function named _ directly into an error, as currently we
keep track of the type of the first definition if there are multiple functions defined
as _, instead of the type of the last definition, and functions are usually not meant
to be called directly if they're named _.

Have you read the Contributing Guidelines?

(Once you have, delete this section. If you leave it in, your PR may be closed without action.)

Description

(Explain how this PR changes mypy.)

Test Plan

(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work.)

This PR causes mypy to not show an error if a function named _ is redefined, 
as a single underscore is often used as a name for a throwaway function.

This handles the case where _ is used as an alias for gettext by differentiating
between functions that are aliased as _ but defined with another name, 
and functions that are defined as _. Overwriting a function named _ is allowed,
but overwriting a function named something else but aliased as _ is not allowed,
which should prevent people from accidentally overwriting gettext after importing it.

This also turns calling a function named _ directly into an error, as currently we 
keep track of the type of the first definition if there are multiple functions defined 
as _, instead of the type of the last definition, and functions are usually not meant
to be called directly if they're named _.
@sthagen sthagen merged commit 10203a9 into sthagen:master Jul 15, 2021
@github-actions
Copy link

Diff from mypy_primer, showing the effect of this PR on open source code:

ibis (https://github.com/ibis-project/ibis.git)
- version: 0.920+dev.10203a9ace35c0792b19565f97d8dacc97130c95
+ version: 0.920+dev.3ffdd88eaffea434989d061f6ee06bdf4632638b
-   File "/tmp/mypy_primer/old_mypy/venv/bin/mypy", line 8, in <module>
+   File "/tmp/mypy_primer/new_mypy/venv/bin/mypy", line 8, in <module>
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/__main__.py", line 11, in console_entry
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/__main__.py", line 11, in console_entry
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/main.py", line 87, in main
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/main.py", line 87, in main
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/main.py", line 165, in run_build
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/main.py", line 165, in run_build
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 179, in build
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 179, in build
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 254, in _build
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 254, in _build
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 2698, in dispatch
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 2698, in dispatch
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 3022, in process_graph
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 3022, in process_graph
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 3120, in process_stale_scc
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 3120, in process_stale_scc
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 2166, in type_check_first_pass
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/build.py", line 2166, in type_check_first_pass
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 295, in check_first_pass
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 295, in check_first_pass
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 402, in accept
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 402, in accept
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/nodes.py", line 783, in accept
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/nodes.py", line 783, in accept
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 3640, in visit_decorator
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checker.py", line 3640, in visit_decorator
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 951, in check_call
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 951, in check_call
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 932, in check_call
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 932, in check_call
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 1044, in check_callable_call
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 1044, in check_callable_call
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 752, in apply_function_plugin
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/checkexpr.py", line 752, in apply_function_plugin
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 192, in call_singledispatch_function_after_register_argument
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 192, in call_singledispatch_function_after_register_argument
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 159, in register_function
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 159, in register_function
-   File "/tmp/mypy_primer/old_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 33, in get_singledispatch_info
+   File "/tmp/mypy_primer/new_mypy/venv/lib/python3.8/site-packages/mypy/plugins/singledispatch.py", line 33, in get_singledispatch_info

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants