-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
importlib.metadata.version can return None #91216
Comments
Originally written up at the typeshed repo: python/typeshed#7513. The conclusion was that this is a bug in the implementation rather than an incorrect annotation. To my surprise, I discovered in matrix-org/synapse#12223 that it is possible for
As well as importlib.metadata.version, importlib.metadata.Distribution.version and importlib.metadata.Distribution.name return None in this situation. I couldn't see any suggestion in the stdlib docs (https://docs.python.org/3.10/library/importlib.metadata.html#distribution-versions) that this was possible. (Aside: it'd be great if the docs mention that PackageNotFoundError is raised if a package is not installed.) No-one in their right mind should do step 4 willingly, but I have seen it happen in the wild (matrix-org/synapse#12223). We suspected a botched backup or similar was to blame. I'm not familiar with all the machinery of Python package management, but I think I'd expect there to be a PackageNotFoundError raised in this situation? (I can imagine a package that doesn't declare its version, where It looks like this might be related to python/importlib_metadata#371? |
Thanks for the report. Yes, the issues are related, where .version and .name returning None are specific manifestations of the metadata not having that key and the behavior being ill-defined. I haven't yet decided if metadata items being undefined should result in None or raise an Exception (maybe KeyError). For the specific case of a missing Name or Version, however, the packaging spec says that these fields are required (https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata-specifications), so it may be reasonable for the behavior when the specification is not met that the resulting behavior would be undefined (i.e. importlib.metadata should be able to assume the specification). It's outside the scope of importlib.metadata to detect, report, and repair invalid metadata. I would welcome and even encourage a third-party package to take on the responsibility of validating all distributions in an environment and reporting on non-compliant aspects. In that sense, the type declaration is correct. This additional example leads me stronger toward the position that I'd also argue that if the metadata file is missing altogether, that should perhaps be a different error. That is, missing metadata is different from null metadata. Right now, the two are indistinguishable from the interface.
That doesn't sound quite right to me. If there's a
I'm going to ponder this one some more and probably address the |
This comment was marked as off-topic.
This comment was marked as off-topic.
Hi Ralf. The issue you describe is different, so I'll move it to another bug. |
FWIW, I noticed that I had two torch directories under
After I removed that |
This issue is being addressed in python/importlib_metadata#371, the first stage (deprecation) being rolled into CPython in 3.12 as #103584. |
In rare cases, `importlib.metadata` values may contain `None`, see python/cpython#91216 and python/importlib_metadata#371 The fix skips all distributions with incomplete metadata.
In rare cases, `importlib.metadata` values may contain `None`, see python/cpython#91216 and python/importlib_metadata#371 The fix skips all distributions with incomplete metadata.
In rare cases, `importlib.metadata` values may contain `None`, see python/cpython#91216 and python/importlib_metadata#371 Co-authored-by: Ivana Kellyerova <ivana.kellyerova@sentry.io> Co-authored-by: Anton Pirker <anton.pirker@sentry.io>
pkg_resources.get_distribution("torch").version always works, even if deprecated,... should be used if other methods fail |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: