Skip to content

Commit db029a5

Browse files
fix(client): don't cause crashes when inspecting the module (#897)
1 parent 17ac677 commit db029a5

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

src/openai/_utils/_proxy.py

+22-4
Original file line numberDiff line numberDiff line change
@@ -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:

src/openai/lib/_old_api.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import TYPE_CHECKING
3+
from typing import TYPE_CHECKING, Any
44
from typing_extensions import override
55

66
from .._utils import LazyProxy
@@ -23,13 +23,19 @@ def __init__(self, *, symbol: str) -> None:
2323
super().__init__(INSTRUCTIONS.format(symbol=symbol))
2424

2525

26-
class APIRemovedInV1Proxy(LazyProxy[None]):
26+
class APIRemovedInV1Proxy(LazyProxy[Any]):
2727
def __init__(self, *, symbol: str) -> None:
2828
super().__init__()
2929
self._symbol = symbol
3030

3131
@override
32-
def __load__(self) -> None:
32+
def __load__(self) -> Any:
33+
# return the proxy until it is eventually called so that
34+
# we don't break people that are just checking the attributes
35+
# of a module
36+
return self
37+
38+
def __call__(self, *_args: Any, **_kwargs: Any) -> Any:
3339
raise APIRemovedInV1(symbol=self._symbol)
3440

3541

0 commit comments

Comments
 (0)