blob: e7b648899e31eb873721578098d1ba41e43e0d79 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
"""Tests for unexpected-keyword-arg"""
# pylint: disable=undefined-variable, too-few-public-methods, missing-function-docstring, missing-class-docstring
def non_param_decorator(func):
"""Decorator without a parameter"""
def new_func():
func()
return new_func
def param_decorator(func):
"""Decorator with a parameter"""
def new_func(internal_arg=3):
func(junk=internal_arg)
return new_func
def kwargs_decorator(func):
"""Decorator with kwargs.
The if ... else makes the double decoration with param_decorator valid.
"""
def new_func(**kwargs):
if "internal_arg" in kwargs:
func(junk=kwargs["internal_arg"])
else:
func(junk=kwargs["junk"])
return new_func
@non_param_decorator
def do_something(junk=None):
"""A decorated function. This should not be passed a keyword argument"""
print(junk)
do_something(internal_arg=2) # [unexpected-keyword-arg]
@param_decorator
def do_something_decorated(junk=None):
"""A decorated function. This should be passed a keyword argument"""
print(junk)
do_something_decorated(internal_arg=2)
@kwargs_decorator
def do_something_decorated_too(junk=None):
"""A decorated function. This should be passed a keyword argument"""
print(junk)
do_something_decorated_too(internal_arg=2)
@non_param_decorator
@kwargs_decorator
def do_something_double_decorated(junk=None):
"""A decorated function. This should not be passed a keyword argument.
non_param_decorator will raise an exception if a keyword argument is passed.
"""
print(junk)
do_something_double_decorated(internal_arg=2) # [unexpected-keyword-arg]
@param_decorator
@kwargs_decorator
def do_something_double_decorated_correct(junk=None):
"""A decorated function. This should be passed a keyword argument"""
print(junk)
do_something_double_decorated_correct(internal_arg=2)
# Test that we don't crash on Class decoration
class DecoratorClass:
pass
@DecoratorClass
def crash_test():
pass
crash_test(internal_arg=2) # [unexpected-keyword-arg]
# Test that we don't emit a false positive for uninferable decorators
@unknown_decorator
def crash_test_two():
pass
crash_test_two(internal_arg=2)
# Test that we don't crash on decorators that don't return anything
def no_return_decorator(func):
print(func)
@no_return_decorator
def test_no_return():
pass
test_no_return(internal_arg=2) # [unexpected-keyword-arg]
|