13
13
# limitations under the License.
14
14
15
15
import inspect
16
- from typing import Any , Callable , Dict , List , Optional
16
+ from types import MethodType
17
+ from typing import Any , Callable , Dict , List , Optional , cast
17
18
18
19
from playwright ._impl ._api_types import Error
19
20
20
- INSTANCE_ATTR = "_pw_api_instance"
21
+ API_ATTR = "_pw_api_instance_"
22
+ IMPL_ATTR = "_pw_impl_instance_"
21
23
22
24
23
25
class ImplWrapper :
@@ -41,10 +43,10 @@ def from_maybe_impl(self, obj: Any) -> Any:
41
43
return [self .from_maybe_impl (item ) for item in obj ]
42
44
api_class = self ._mapping .get (type (obj ))
43
45
if api_class :
44
- api_instance = getattr (obj , INSTANCE_ATTR , None )
46
+ api_instance = getattr (obj , API_ATTR , None )
45
47
if not api_instance :
46
48
api_instance = api_class (obj )
47
- setattr (obj , INSTANCE_ATTR , api_instance )
49
+ setattr (obj , API_ATTR , api_instance )
48
50
return api_instance
49
51
else :
50
52
return obj
@@ -85,8 +87,21 @@ def wrapper_func(*args: Any) -> Any:
85
87
* list (map (lambda a : self .from_maybe_impl (a ), args ))[:arg_count ]
86
88
)
87
89
88
- wrapper = getattr (handler , INSTANCE_ATTR , None )
90
+ if inspect .ismethod (handler ):
91
+ wrapper = getattr (
92
+ cast (MethodType , handler ).__self__ , IMPL_ATTR + handler .__name__ , None
93
+ )
94
+ if not wrapper :
95
+ wrapper = wrapper_func
96
+ setattr (
97
+ cast (MethodType , handler ).__self__ ,
98
+ IMPL_ATTR + handler .__name__ ,
99
+ wrapper ,
100
+ )
101
+ return wrapper
102
+
103
+ wrapper = getattr (handler , IMPL_ATTR , None )
89
104
if not wrapper :
90
105
wrapper = wrapper_func
91
- setattr (handler , INSTANCE_ATTR , wrapper )
106
+ setattr (handler , IMPL_ATTR , wrapper )
92
107
return wrapper
0 commit comments