Python: Update tests for py/import-own-module

So I've been thinking a bit about import pkg_ok.foo1 after reading the Python
references for imports of submodules
https://docs.python.org/3/reference/import.html#submodules

> When a submodule is loaded using any mechanism (...) a binding is placed in the
parent module’s namespace to the submodule object. For example, if package spam
has a submodule foo, after importing spam.foo, spam will have an attribute foo
which is bound to the submodule.

That does at least explain what is going on here.

I feel that import pkg_ok.foo1 might be a very contrived example. In principle
it should be an alert, since the module pkg_ok ends up with an import of itself,
but my gut feeling is that in practice it's not a very important piece of code
to give alerts for. if we really care about giving these import related alerts,
we could probably add a new query for this pattern, as it's kind of surprising
that it works when you're just an ordinary python programmer.
This commit is contained in:
Rasmus Wriedt Larsen
2020-02-11 11:34:55 +01:00
parent 2bffbf0734
commit f3f9e340d3
4 changed files with 17 additions and 9 deletions

View File

@@ -1,9 +1,10 @@
| imports_test.py:8:1:8:19 | Import | The module 'imports_test' imports itself. |
| pkg_notok/__init__.py:4:1:4:16 | Import | The module 'pkg_notok' imports itself. |
| pkg_notok/__init__.py:6:1:6:25 | Import | The module 'pkg_notok' imports itself. |
| pkg_notok/__init__.py:7:1:7:37 | Import | The module 'pkg_notok' imports itself. |
| pkg_ok/__init__.py:2:1:2:18 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:4:1:4:23 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:5:1:5:28 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:7:1:7:18 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:8:1:8:22 | Import | The module 'pkg_ok' imports itself. |
| pkg_notok/__init__.py:10:1:10:20 | Import | The module 'pkg_notok' imports itself. |
| pkg_notok/__init__.py:12:1:12:25 | Import | The module 'pkg_notok' imports itself. |
| pkg_notok/__init__.py:13:1:13:37 | Import | The module 'pkg_notok' imports itself. |
| pkg_ok/__init__.py:1:1:1:26 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:3:1:3:23 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:4:1:4:28 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:6:1:6:18 | Import | The module 'pkg_ok' imports itself. |
| pkg_ok/__init__.py:7:1:7:22 | Import | The module 'pkg_ok' imports itself. |

View File

@@ -3,6 +3,12 @@ class Foo(object):
import pkg_notok
# This import is a bit tricky. It will make `bar` available in as `pkg_notok.bar` as a
# side effect (see https://docs.python.org/3/reference/import.html#submodules), but the
# *import* will add a binding to `pkg_notok` to the current scope -- so technically the
# module imports itself.
import pkg_notok.bar
from pkg_notok import Foo
from pkg_notok import Foo as NotOkFoo
from pkg_notok import * # TODO: TN

View File

@@ -0,0 +1,2 @@
class Bar():
pass

View File

@@ -1,5 +1,4 @@
# This import makes `pkg_ok` available, but also `foo1` (surprising as it may be)
import pkg_ok.foo1 # TODO: FP
import pkg_ok.foo1 as foo1 # TODO: FP
from pkg_ok import foo2 # TODO: FP
from pkg_ok.foo3 import Foo3 # TODO: FP