typing: set no_implicit_reexport

In Python, if module A defines a name `name`, and module B does `import
name from A`, then another module C can `import name from B`.

Sometimes it is intentional -- module B is meant to "reexport" `name`.
But sometimes it is just confusion/inconsistency on where `name` should
be imported from.

mypy has a flag `--no-implicit-reexport` which puts some order into
this. A name can only be imported from a module if

1. The module defines the name
2. The module's `__all__` includes the name
3. The module imports the name as `from ... import .. as name`.

This flag is included in mypy's `--strict` flag.

I like this flag, but I realize it is a bit controversial, and in
particular item 3 above is a bit unfriendly to contributors who don't
know about it. So I didn't intend to add it to pytest.

But while investigating issue 7589 I came upon mypy issue 8754 which
causes `--no-implicit-reexport` to leak into installed libraries and
causes some unexpected typing differences *in pytest* if the user uses
this flag.

Since the diff mostly makes sense, let's just conform to it.
This commit is contained in:
Ran Benita
2020-07-31 09:46:56 +03:00
parent 645cbc91fc
commit 8d98de8f8a
11 changed files with 39 additions and 28 deletions

View File

@@ -19,6 +19,8 @@ from hypothesis import strategies
import pytest
from _pytest import fixtures
from _pytest import python
from _pytest.compat import _format_args
from _pytest.compat import getfuncargnames
from _pytest.outcomes import fail
from _pytest.pytester import Testdir
from _pytest.python import _idval
@@ -41,7 +43,7 @@ class TestMetafunc:
obj = attr.ib()
_nodeid = attr.ib()
names = fixtures.getfuncargnames(func)
names = getfuncargnames(func)
fixtureinfo = FuncFixtureInfoMock(names) # type: Any
definition = DefinitionMock._create(func, "mock::nodeid") # type: Any
return python.Metafunc(definition, fixtureinfo, config)
@@ -954,22 +956,22 @@ class TestMetafunc:
def function1():
pass
assert fixtures._format_args(function1) == "()"
assert _format_args(function1) == "()"
def function2(arg1):
pass
assert fixtures._format_args(function2) == "(arg1)"
assert _format_args(function2) == "(arg1)"
def function3(arg1, arg2="qwe"):
pass
assert fixtures._format_args(function3) == "(arg1, arg2='qwe')"
assert _format_args(function3) == "(arg1, arg2='qwe')"
def function4(arg1, *args, **kwargs):
pass
assert fixtures._format_args(function4) == "(arg1, *args, **kwargs)"
assert _format_args(function4) == "(arg1, *args, **kwargs)"
class TestMetafuncFunctional: