From b893c949508920c97bc91369de2b091e91587977 Mon Sep 17 00:00:00 2001 From: Andrew Haigh Date: Sat, 24 Apr 2021 09:37:03 +1000 Subject: [PATCH 1/2] Add regression tests of inference of implicit None return Ref PyCQA/astroid#485. Depends on PyCQA/astroid#983. --- .../regression_implicit_none_with_no_return.py | 18 ++++++++++++++++++ ...regression_implicit_none_with_no_return.txt | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 tests/functional/r/regression/regression_implicit_none_with_no_return.py create mode 100644 tests/functional/r/regression/regression_implicit_none_with_no_return.txt diff --git a/tests/functional/r/regression/regression_implicit_none_with_no_return.py b/tests/functional/r/regression/regression_implicit_none_with_no_return.py new file mode 100644 index 0000000000..4e6fc4d28c --- /dev/null +++ b/tests/functional/r/regression/regression_implicit_none_with_no_return.py @@ -0,0 +1,18 @@ +# pylint: disable=missing-docstring,pointless-statement,invalid-name,no-self-use + +class A: + def func(self): + print('hello') + + @property + def index(self): + print('world') + + +# Since these are not assigned anywhere, assignment-from-none etc. +# in typecheck does not warn + +a = A() +# double call is workaround for #4426 +a.func()() # [not-callable] +[1, 2, 3][a.index] # [invalid-sequence-index] diff --git a/tests/functional/r/regression/regression_implicit_none_with_no_return.txt b/tests/functional/r/regression/regression_implicit_none_with_no_return.txt new file mode 100644 index 0000000000..5163b7b7c0 --- /dev/null +++ b/tests/functional/r/regression/regression_implicit_none_with_no_return.txt @@ -0,0 +1,2 @@ +not-callable:17:0::a.func() is not callable +invalid-sequence-index:18:0::Sequence index is not an int, slice, or instance with __index__ From e445511e21383d80f65348de2b38604def5b5a0c Mon Sep 17 00:00:00 2001 From: Andrew Haigh Date: Sun, 2 May 2021 20:18:31 +1000 Subject: [PATCH 2/2] Update tests to return size from __len__ No reason why they can't when it's relevant, instead of disabling this warning --- tests/functional/a/abstract/abstract_class_instantiated_py3.py | 2 +- tests/functional/a/abstract/abstract_method_py3.py | 2 +- tests/functional/n/no/no_self_use.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/a/abstract/abstract_class_instantiated_py3.py b/tests/functional/a/abstract/abstract_class_instantiated_py3.py index c027833e73..bf2ef2e039 100644 --- a/tests/functional/a/abstract/abstract_class_instantiated_py3.py +++ b/tests/functional/a/abstract/abstract_class_instantiated_py3.py @@ -58,7 +58,7 @@ def __contains__(self, _): class Sizable(Structure): def __len__(self): - pass + return 42 class Hashable(Structure): __hash__ = 42 diff --git a/tests/functional/a/abstract/abstract_method_py3.py b/tests/functional/a/abstract/abstract_method_py3.py index 8bb4918192..d58f68036c 100644 --- a/tests/functional/a/abstract/abstract_method_py3.py +++ b/tests/functional/a/abstract/abstract_method_py3.py @@ -75,7 +75,7 @@ def __contains__(self, _): # +1: [abstract-method, abstract-method, abstract-method] class Sizable(Structure): def __len__(self): - pass + return 42 # +1: [abstract-method, abstract-method, abstract-method] diff --git a/tests/functional/n/no/no_self_use.py b/tests/functional/n/no/no_self_use.py index a28243df85..f84ab15730 100644 --- a/tests/functional/n/no/no_self_use.py +++ b/tests/functional/n/no/no_self_use.py @@ -53,7 +53,7 @@ def method(self): def __len__(self): """no i can not be a function""" - print(42) + return 42 def __cmp__(self, other): """no i can not be a function"""