@@ -18,25 +18,43 @@ class LazyProxy(Generic[T], ABC):
18
18
def __init__ (self ) -> None :
19
19
self .__proxied : T | None = None
20
20
21
+ # Note: we have to special case proxies that themselves return proxies
22
+ # to support using a proxy as a catch-all for any random access, e.g. `proxy.foo.bar.baz`
23
+
21
24
def __getattr__ (self , attr : str ) -> object :
22
- return getattr (self .__get_proxied__ (), attr )
25
+ proxied = self .__get_proxied__ ()
26
+ if isinstance (proxied , LazyProxy ):
27
+ return proxied # pyright: ignore
28
+ return getattr (proxied , attr )
23
29
24
30
@override
25
31
def __repr__ (self ) -> str :
32
+ proxied = self .__get_proxied__ ()
33
+ if isinstance (proxied , LazyProxy ):
34
+ return proxied .__class__ .__name__
26
35
return repr (self .__get_proxied__ ())
27
36
28
37
@override
29
38
def __str__ (self ) -> str :
30
- return str (self .__get_proxied__ ())
39
+ proxied = self .__get_proxied__ ()
40
+ if isinstance (proxied , LazyProxy ):
41
+ return proxied .__class__ .__name__
42
+ return str (proxied )
31
43
32
44
@override
33
45
def __dir__ (self ) -> Iterable [str ]:
34
- return self .__get_proxied__ ().__dir__ ()
46
+ proxied = self .__get_proxied__ ()
47
+ if isinstance (proxied , LazyProxy ):
48
+ return []
49
+ return proxied .__dir__ ()
35
50
36
51
@property # type: ignore
37
52
@override
38
53
def __class__ (self ) -> type :
39
- return self .__get_proxied__ ().__class__
54
+ proxied = self .__get_proxied__ ()
55
+ if issubclass (type (proxied ), LazyProxy ):
56
+ return type (proxied )
57
+ return proxied .__class__
40
58
41
59
def __get_proxied__ (self ) -> T :
42
60
if not self .should_cache :
0 commit comments