@@ -18,25 +18,43 @@ class LazyProxy(Generic[T], ABC):
1818 def __init__ (self ) -> None :
1919 self .__proxied : T | None = None
2020
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+
2124 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 )
2329
2430 @override
2531 def __repr__ (self ) -> str :
32+ proxied = self .__get_proxied__ ()
33+ if isinstance (proxied , LazyProxy ):
34+ return proxied .__class__ .__name__
2635 return repr (self .__get_proxied__ ())
2736
2837 @override
2938 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 )
3143
3244 @override
3345 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__ ()
3550
3651 @property # type: ignore
3752 @override
3853 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__
4058
4159 def __get_proxied__ (self ) -> T :
4260 if not self .should_cache :
0 commit comments