Comments (2)
Oh, this is a mess of Python typing misfeatures and bugs.
So Union[...]
types are only sort-of compatible with isinstance
checks. In earlier versions of Python they simply errored out; in later versions of python then they just delegate to using type
and issubclass
, in blatant disregard for custom __instancecheck__
methods, or the fact that "non-faithful" types exist (those types y
for which isinstance(x, y)
does not imply issubclass(type(x), y)
, e,g, jaxtyping types for which y
carries additional metadata about the shape and dtype).
There's no good reason for this. Union
was originally introduced for static type checking, and runtime considerations have been almost entirely ignored by the Python standards commitees.
To further complication life, in Python 3.10 then A | B
produces an object with type types.UnionType
, whilst Union[A, B]
. produces a typing._UnionGenericAlias
object.
Once again, there is no good reason for this discrepancy: runtime considerations have been almost entirely ignored by the standards committee.
And so for some weird reason, as A | B
is a different object to Union[A, B]
, here we find that the former is compatible with isinstance
checks in the way you're doing (which is discussed in the relevant PEP), but the latter is not. (Which is a detail that goes entirely undiscussed in the PEP.)
And, once again! There is no good reason for this. The standards commitee have not given any thought to runtime considerations. Yes, this is maddening.
Anyway. what can we do about it? This:
assert isinstance(x, Shaped[Union[Array, np.ndarray], "_"])
fails because of the diversion via type
and issubclass
. The fix for this would be to upstream a fix to Python itself.
Meanwhile this:
assert isinstance(x, Shaped[Array | np.ndarray, "_"])
fails because A | B
is a different type to Union[A, B]
-- an odd detail that I didn't know about until now -- and so this check in jaxtyping for union handling does not trigger. The fix for this would be to adjust jaxtyping to look for typing.Union
-- and on later versions of Python only, also types.UnionType
.
I would be happy to accept a PR on this.
Meanwhile, if you want some code that will work today, and is version-compatible across all jaxtyping and Python versions, then you can unpack a Union
like so:
x = jnp.zeros([3])
y = Shaped[Union[Array, np.ndarray], "_"]
assert isinstance(x, typing.get_args(y))
from jaxtyping.
The crash with Shaped[A | B, ...]
should be fixed in #77 (version 0.2.15).
from jaxtyping.
Related Issues (20)
- Feature request: Remove entry "modules" in function "install_import _hook()" HOT 2
- Venv `__pycache__` directories filling up HOT 1
- Failed to compile with Union HOT 3
- Type annotations must now include an explicit array type HOT 5
- Simple script error HOT 2
- A bug with typechecking fields of dataclasses with default values/factories HOT 14
- Support for jax.dtypes.prng_key, to denote jax.Arrays of PRNG keys, as in [JEP 9263](https://jax.rtfd.io/en/latest/jep/9263-typed-keys.html). HOT 2
- test_import_hook_transitive is flaky! HOT 2
- Order of symbolic expression evaluation HOT 2
- Module-level import hook HOT 1
- Support runtime type-checking of generic functions HOT 1
- Random key does not typecheck Key[Scalar, ""] HOT 2
- Weird `KeyError: '0'` when using None typechecker for `install_import_hook` HOT 4
- ImportError: cannot import name 'Array' from 'jaxtyping' HOT 2
- Symbolic expressions in argument annotations HOT 3
- Old-style decoration fails to raise on dataclasses since 0.2.24 HOT 1
- will runtime type checking go beyond function parameters and return type? HOT 9
- [DOC] Need better documentation about `from __future__ import annotations` HOT 3
- How can I inspect the jaxtyping bindings? HOT 2
- IPython `inspect.getsource()` failure due to incorrect co_firstlineno HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jaxtyping.