1313# limitations under the License.
1414
1515import 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
1718
1819from playwright ._impl ._api_types import Error
1920
20- INSTANCE_ATTR = "_pw_api_instance"
21+ API_ATTR = "_pw_api_instance_"
22+ IMPL_ATTR = "_pw_impl_instance_"
2123
2224
2325class ImplWrapper :
@@ -41,10 +43,10 @@ def from_maybe_impl(self, obj: Any) -> Any:
4143 return [self .from_maybe_impl (item ) for item in obj ]
4244 api_class = self ._mapping .get (type (obj ))
4345 if api_class :
44- api_instance = getattr (obj , INSTANCE_ATTR , None )
46+ api_instance = getattr (obj , API_ATTR , None )
4547 if not api_instance :
4648 api_instance = api_class (obj )
47- setattr (obj , INSTANCE_ATTR , api_instance )
49+ setattr (obj , API_ATTR , api_instance )
4850 return api_instance
4951 else :
5052 return obj
@@ -85,8 +87,21 @@ def wrapper_func(*args: Any) -> Any:
8587 * list (map (lambda a : self .from_maybe_impl (a ), args ))[:arg_count ]
8688 )
8789
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 )
89104 if not wrapper :
90105 wrapper = wrapper_func
91- setattr (handler , INSTANCE_ATTR , wrapper )
106+ setattr (handler , IMPL_ATTR , wrapper )
92107 return wrapper
0 commit comments