Skip to content

Allow redefinition of underscore functions #10811

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 15, 2021

Conversation

pranavrajpal
Copy link
Contributor

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 _.

Test Plan

I added several tests to check-redefine.test.

Add tests to make sure that functions named '_' are allowed to be
redefined multiple times.
Add a test that makes sure that we reject overwriting an imported
function that is aliased as _ with an underscore function, as that is
probably an error (especially when using _ as an alias for gettext).
Allow functions called '_' to be redefined, instead of showing an error
as we would if a function with any other name was redefined.
Change a singledispatch test that tested whether multiple underscore
functions being used wasn't an error from xfail to regular test, as the
previous commits made that not be an error any more.
@github-actions

This comment has been minimized.

Don't show an error about calling a function named '_' directly when '_'
refers to a class named '_' and we're actually creating an object.
Having a class named '_' is probably rare and using it directly is
probably even rarer, but the other parts of the PR only deal with
functions, not classes, so we probably should keep that consistent.
Remove a test that has a function named '_' that it calls directly, as
naming functions '_' is now an error (which makes it impossible to test
what that test was originally testing).
@github-actions

This comment has been minimized.

@@ -455,7 +455,7 @@ def fix_function_overloads(self, stmts: List[Statement]) -> List[Statement]:
elif len(current_overload) > 1:
ret.append(OverloadedFuncDef(current_overload))

if isinstance(stmt, Decorator):
if isinstance(stmt, Decorator) and stmt.name != "_":
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this needed for?
(We probably need to do it in fastparse2 also)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there are multiple decorated functions right next to each other all named _, the parser creates an OverloadedFuncDef instead of using regular FuncDefs, and this change means we can just check for redefined FuncDefs instead of worrying about OverloadedFuncDefs.

Now that I think about it, it would probably be better to handle OverloadedFuncDefs that are named _ in the semantic analyzer, instead of doing this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that I think about it, it would probably be better to handle OverloadedFuncDefs that are named _ in the semantic analyzer, instead of doing this.

I did this in 385554f. Could you take a look?

Instead of turning adjacent decorated underscore functions into a series
of FuncDefs instead of one OverloadedFuncDef in the parser, handle
OverloadedFuncDefs named '_' in semanal. That prevents us from needing
to make that change in fastparse2, and move the handling of the
underscore function case closer to where the error would be emitted.
@github-actions
Copy link
Contributor

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.d0bd1c8ab2585fd1194f753c1a4b5d2a1392e015
+ version: 0.920+dev.ee1f82e8ff6345fc6b798efebd185bc65dbd08ef
-   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 944, 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 925, 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 1037, 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 745, 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

sympy (https://github.com/sympy/sympy.git)
+ sympy/logic/boolalg.py:69: error: Incompatible types in assignment (expression has type "_BooleanKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/numbers.py:591: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/numbers.py:2509: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/numbers.py:2514: error: Need type annotation for "free_symbols" (hint: "free_symbols: Set[<type>] = ...")
+ sympy/core/numbers.py:3390: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/numbers.py:3445: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/numbers.py:4016: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/core/mod.py:35: error: Incompatible types in assignment (expression has type "_NumberKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/tensor/array/sparse_ndim_array.py:101: error: Definition of "kind" in base class "NDimArray" is incompatible with definition in base class "Basic"
+ sympy/tensor/array/ndim_array.py:582: error: Definition of "kind" in base class "NDimArray" is incompatible with definition in base class "Basic"
+ sympy/tensor/array/dense_ndim_array.py:122: error: Definition of "kind" in base class "NDimArray" is incompatible with definition in base class "Basic"
+ sympy/solvers/ode/single.py:1632: error: Module not callable
+ sympy/solvers/ode/single.py:1947: error: "Dummy" has no attribute "name"
+ sympy/matrices/expressions/matmul.py:19: error: Cannot determine type of "kind" in base class "MatrixExpr"
+ sympy/matrices/expressions/matexpr.py:79: error: Incompatible types in assignment (expression has type "MatrixKind", base class "Basic" defined the type as "_UndefinedKind")
+ sympy/matrices/expressions/matadd.py:17: error: Cannot determine type of "kind" in base class "MatrixExpr"
+ sympy/abc.py:96: error: Need type annotation for "_clash1" (hint: "_clash1: Dict[<type>, <type>] = ...")
+ sympy/abc.py:97: error: Need type annotation for "_clash2" (hint: "_clash2: Dict[<type>, <type>] = ...")
- sympy/assumptions/sathandlers.py:217: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:227: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:236: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:247: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:256: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:263: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:269: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:281: error: Name "_" already defined on line 204
- sympy/assumptions/sathandlers.py:290: error: Name "_" already defined on line 204
+ sympy/assumptions/relation/equality.py:52: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:53: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:96: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:97: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:140: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:141: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:188: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:189: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:236: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:237: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:284: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
+ sympy/assumptions/relation/equality.py:285: error: Incompatible types in assignment (expression has type "bool", base class "BinaryRelation" defined the type as "None")
- sympy/assumptions/handlers/order.py:48: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:55: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:79: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:95: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:119: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:123: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:132: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:141: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:151: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:158: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:170: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:176: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:185: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:189: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:193: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:200: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:207: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:212: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:220: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:227: error: Name "_" already defined on line 43
- sympy/assumptions/handlers/order.py:265: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:270: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:284: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:304: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:325: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:333: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:343: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:349: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:353: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:357: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:362: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:367: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:373: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:377: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:385: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:391: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:395: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:402: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:409: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:416: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:425: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/order.py:434: error: Name "_" already defined on line 258
- sympy/assumptions/handlers/ntheory.py:41: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:46: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:57: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:68: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:72: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:76: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:80: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:84: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:91: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:98: error: Name "_" already defined on line 34
- sympy/assumptions/handlers/ntheory.py:139: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:144: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:185: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:206: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:218: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:222: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:226: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:230: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:235: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:240: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:245: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:252: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/ntheory.py:259: error: Name "_" already defined on line 132
- sympy/assumptions/handlers/common.py:62: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:69: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:73: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:80: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:84: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:88: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:92: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:96: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:108: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:119: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:130: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/common.py:135: error: Name "_" already defined on line 50
- sympy/assumptions/handlers/calculus.py:31: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:113: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:168: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:200: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:204: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:212: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:217: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:221: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:229: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:237: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:242: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:250: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/calculus.py:255: error: Name "_" already defined on line 20
- sympy/assumptions/handlers/sets.py:42: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:47: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:54: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:65: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:93: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:97: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:104: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:108: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:112: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:117: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:124: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:136: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:155: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:161: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:167: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:173: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:182: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:189: error: Name "_" already defined on line 38
- sympy/assumptions/handlers/sets.py:217: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:221: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:228: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:238: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:258: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:322: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:327: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:333: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:337: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:344: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:353: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:357: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:364: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:370: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:380: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:405: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:421: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:427: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:433: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:451: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:456: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:460: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:467: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:471: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:477: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:481: error: Name "_" already defined on line 212
- sympy/assumptions/handlers/sets.py:497: note: (Skipping most remaining errors due to unresolved imports or missing stubs; fix these first)
+ sympy/utilities/matchpy_connector.py:101: error: Name "Wildcard" already defined (possibly by an import)
+ sympy/utilities/matchpy_connector.py:148: error: Incompatible types in assignment (expression has type "int", base class "_WildAbstract" defined the type as "None")
+ sympy/utilities/matchpy_connector.py:149: error: Incompatible types in assignment (expression has type "bool", base class "_WildAbstract" defined the type as "None")
+ sympy/utilities/matchpy_connector.py:154: error: Incompatible types in assignment (expression has type "int", base class "_WildAbstract" defined the type as "None")
+ sympy/utilities/matchpy_connector.py:155: error: Incompatible types in assignment (expression has type "bool", base class "_WildAbstract" defined the type as "None")
+ sympy/utilities/matchpy_connector.py:160: error: Incompatible types in assignment (expression has type "int", base class "_WildAbstract" defined the type as "None")
+ sympy/utilities/matchpy_connector.py:161: error: Incompatible types in assignment (expression has type "bool", base class "_WildAbstract" defined the type as "None")
+ sympy/tensor/array/expressions/conv_matrix_to_array.py:40: error: "Basic" has no attribute "shape"
+ sympy/tensor/array/expressions/conv_matrix_to_array.py:53: error: Argument 1 to "convert_matrix_to_array" has incompatible type "Basic"; expected "MatrixExpr"
+ sympy/stats/frv_types.py:684: error: Decorated property not supported
+ sympy/stats/stochastic_process_types.py:86: error: Incompatible types in assignment (expression has type "sympy.core.containers.Tuple", variable has type "Sequence[Any]")
+ sympy/stats/stochastic_process_types.py:92: error: Incompatible types in assignment (expression has type "sympy.core.containers.Tuple", variable has type "Sequence[Any]")
+ sympy/stats/stochastic_process_types.py:98: error: Incompatible types in assignment (expression has type "sympy.core.containers.Tuple", variable has type "Sequence[Any]")
+ sympy/stats/stochastic_process_types.py:912: error: The erased type of self "sympy.core.basic.Basic" is not a supertype of its class "Type[sympy.stats.stochastic_process_types.DiscreteMarkovChain]"
+ sympy/stats/stochastic_process_types.py:918: error: Argument 1 to "__new__" has incompatible type "Basic"; expected "Type[Basic]"
+ sympy/stats/stochastic_process_types.py:1027: error: Need type annotation for "non_tree_edge_values" (hint: "non_tree_edge_values: Set[<type>] = ...")
+ sympy/stats/stochastic_process_types.py:1224: error: Slice index must be an integer or None
+ sympy/stats/stochastic_process_types.py:1334: error: "DiscreteMarkovChain" has no attribute "index_of"
+ sympy/stats/sampling/sample_scipy.py:17: error: Name "scipy" already defined on line 15
+ sympy/external/tests/test_pythonmpq.py:22: error: Argument 1 to "append" of "list" has incompatible type "Tuple[Any, Type[Any], Any, Type[Any]]"; expected "Tuple[Type[PythonMPQ], Type[PythonMPQ], Type[int], Type[int]]"
+ sympy/unify/tests/test_unify.py:4: error: Unpacking a string is disallowed
+ sympy/physics/mechanics/tests/test_joint.py:8: error: "Callable[[Any, Any, KwArg(Any)], Any]" has no attribute "_t"
+ sympy/parsing/autolev/test-examples/ruletest9.py:44: error: Incompatible types in assignment (expression has type "MutableDenseMatrix", variable has type Module)
+ sympy/parsing/autolev/test-examples/ruletest9.py:45: error: Unsupported target for indexed assignment (Module)
+ sympy/parsing/autolev/test-examples/ruletest9.py:46: error: Module has no attribute "row_insert"
+ sympy/parsing/autolev/test-examples/ruletest9.py:46: error: Module has no attribute "shape"
+ sympy/parsing/autolev/test-examples/ruletest9.py:47: error: Unsupported target for indexed assignment (Module)
+ sympy/parsing/autolev/test-examples/ruletest9.py:47: error: Module has no attribute "shape"
+ sympy/parsing/autolev/test-examples/ruletest9.py:48: error: Value of type Module is not indexable
+ sympy/parsing/autolev/test-examples/ruletest9.py:50: error: Unsupported target for indexed assignment (Module)
+ sympy/parsing/autolev/test-examples/ruletest9.py:51: error: Value of type Module is not indexable
+ sympy/parsing/autolev/test-examples/ruletest7.py:35: error: Value of type Module is not indexable
+ sympy/parsing/autolev/test-examples/ruletest6.py:25: error: Module has no attribute "T"
+ sympy/parsing/autolev/test-examples/ruletest6.py:26: error: Module has no attribute "eigenvals"
+ sympy/parsing/autolev/test-examples/ruletest6.py:31: error: Value of type Module is not indexable
+ sympy/parsing/autolev/test-examples/ruletest6.py:32: error: Module has no attribute "cols"; maybe "cos"?
+ sympy/parsing/autolev/test-examples/ruletest6.py:33: error: Module has no attribute "col"
+ sympy/parsing/autolev/test-examples/ruletest6.py:34: error: Module has no attribute "T"
+ sympy/parsing/autolev/test-examples/ruletest6.py:35: error: Module has no attribute "row"
+ sympy/parsing/autolev/test-examples/ruletest6.py:36: error: Module has no attribute "row"
+ sympy/parsing/autolev/test-examples/ruletest4.py:16: error: "Callable[[Any, Any, KwArg(Any)], Any]" has no attribute "_t"
+ sympy/parsing/autolev/test-examples/ruletest2.py:8: error: "Callable[[Any, Any, KwArg(Any)], Any]" has no attribute "_t"
+ sympy/parsing/autolev/test-examples/ruletest12.py:13: error: "MutableDenseMatrix" has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/ruletest11.py:13: error: "MutableDenseMatrix" has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/ruletest10.py:11: error: Module has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/ruletest10.py:11: error: Module has no attribute "shape"
+ sympy/parsing/autolev/test-examples/ruletest10.py:13: error: Module has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/ruletest10.py:13: error: Module has no attribute "shape"
+ sympy/parsing/autolev/test-examples/ruletest10.py:24: error: Module has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/ruletest10.py:24: error: Module has no attribute "shape"
+ sympy/parsing/autolev/test-examples/pydy-example-repo/non_min_pendulum.py:24: error: "MutableDenseMatrix" has no attribute "__iter__" (not iterable)
+ sympy/parsing/autolev/test-examples/pydy-example-repo/mass_spring_damper.py:10: error: "Callable[[Any, Any, KwArg(Any)], Any]" has no attribute "_t"

@msullivan msullivan merged commit ed09f8d into python:master Jul 15, 2021
@pranavrajpal pranavrajpal deleted the mypy-underscore-functions branch July 15, 2021 01:47
sthagen added a commit to sthagen/python-mypy that referenced this pull request Jul 15, 2021
Allow redefinition of underscore functions (python#10811)
@cjolowicz
Copy link
Contributor

cjolowicz commented Dec 16, 2021

@pranavrajpal @msullivan This is a great improvement, but it's somewhat unfortunate that it comes at the cost of categorically outlawing calling functions named _.

Here's a real world example with an inner function named _, and the outer function a thin wrapper calling _:

def parse_link_header(response: httpx.Response) -> dict[str, str]:
    """Parse the Link header."""

    def _() -> Iterator[tuple[str, str]]:
        header = response.headers["Link"]
        for field in header.split(","):
            url, rel = field.split(";")
            url = url.strip().removeprefix("<").removesuffix(">")
            rel = rel.strip().removeprefix('rel="').removesuffix('"')
            yield rel, url

    return dict(_())

@JelleZijlstra
Copy link
Member

See also #11774.

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.

4 participants