mirror of
https://github.com/wassname/jaxtyping.git
synced 2026-09-09 11:24:55 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59e8fb0d18 | ||
|
|
7dba3516c2 | ||
|
|
2b1be5eb0a |
@@ -28,8 +28,6 @@ def accepts_pytree_of_arrays(x: PyTree[Float[Array, "batch c1 c2"]]):
|
||||
pip install jaxtyping
|
||||
```
|
||||
|
||||
Requires JAX 0.3.4+.
|
||||
|
||||
Also install your favourite runtime type-checking package. The two most popular are [typeguard](https://github.com/agronholm/typeguard) (which exhaustively checks every argument) and [beartype](https://github.com/beartype/beartype) (which checks random pieces of arguments).
|
||||
|
||||
## Documentation
|
||||
|
||||
+19
-6
@@ -79,14 +79,27 @@ from .import_hook import install_import_hook as install_import_hook
|
||||
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
_T = typing.TypeVar("_T")
|
||||
|
||||
class PyTree(typing_extensions.Protocol[_T]):
|
||||
pass
|
||||
|
||||
# Set up to deliberately confuse a static type checker.
|
||||
PyTree = getattr(typing, "foo" + "bar")
|
||||
# What's going on with this madness?
|
||||
#
|
||||
# At static-type-checking-time, we want `PyTree` to be a type for which both
|
||||
# `PyTree` and `PyTree[Foo]` are equivalent to `Any`.
|
||||
# (The intention is that `PyTree` be a runtime-only type; there's no real way to
|
||||
# do more with static type checkers.)
|
||||
#
|
||||
# Unfortunately, this isn't possible: `Any` isn't subscriptable. And there's no
|
||||
# equivalent way we can fake this using typing annotations. (In some sense the
|
||||
# closest thing would be a `Protocol[T]` with no methods, but that's actually the
|
||||
# opposite of what we want: that ends up allowing nothing at all.)
|
||||
#
|
||||
# The good news for us is that static type checkers have an internal escape hatch.
|
||||
# If they can't figure out what a type is, then they just give up and allow
|
||||
# anything. (I believe this is sometimes called `Unknown`.) Thus, this odd-looking
|
||||
# annotation, which static type checkers aren't smart enough to resolve.
|
||||
elif has_jax:
|
||||
from .pytree_type import PyTree
|
||||
|
||||
del has_jax
|
||||
|
||||
__version__ = "0.2.9"
|
||||
__version__ = "0.2.11"
|
||||
|
||||
@@ -59,6 +59,14 @@ class _MetaPyTree(type):
|
||||
return out
|
||||
|
||||
|
||||
try:
|
||||
# new typeguard
|
||||
_TypeCheckError = (TypeError, typeguard.TypeCheckError)
|
||||
except AttributeError:
|
||||
# old typeguard
|
||||
_TypeCheckError = TypeError
|
||||
|
||||
|
||||
class _MetaSubscriptPyTree(type):
|
||||
def __call__(self, *args, **kwargs):
|
||||
raise RuntimeError("PyTree cannot be instantiated")
|
||||
@@ -77,7 +85,7 @@ class _MetaSubscriptPyTree(type):
|
||||
def is_leaftype(x):
|
||||
try:
|
||||
accepts_leaftype(x)
|
||||
except TypeError:
|
||||
except _TypeCheckError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
+19
-4
@@ -18,16 +18,31 @@
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
import equinox as eqx
|
||||
import typeguard
|
||||
|
||||
|
||||
ParamError = []
|
||||
ReturnError = []
|
||||
ParamError.append(TypeError) # old typeguard
|
||||
ReturnError.append(TypeError) # old typeguard
|
||||
|
||||
try:
|
||||
# new typeguard
|
||||
ParamError.append(typeguard.TypeCheckError)
|
||||
ReturnError.append(typeguard.TypeCheckError)
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
try:
|
||||
import beartype
|
||||
except ImportError:
|
||||
ParamError = TypeError
|
||||
ReturnError = TypeError
|
||||
pass
|
||||
else:
|
||||
ParamError = (TypeError, beartype.roar.BeartypeCallHintParamViolation)
|
||||
ReturnError = (TypeError, beartype.roar.BeartypeCallHintReturnViolation)
|
||||
ParamError.append(beartype.roar.BeartypeCallHintParamViolation)
|
||||
ReturnError.append(beartype.roar.BeartypeCallHintReturnViolation)
|
||||
|
||||
ParamError = tuple(ParamError)
|
||||
ReturnError = tuple(ReturnError)
|
||||
|
||||
|
||||
@eqx.filter_jit
|
||||
|
||||
Reference in New Issue
Block a user