I did a quick query of the JSON data on PyPI (I have an offline copy). It’s not going to be entirely accurate, and my check was extremely superficial, but I found 464 projects on PyPI with metadata that might be impacted. That’s not a huge number - and 120 of those appear to be part of an extra, so are not used by default.
List of problem values
Project name Requirement
aiocogeo stac-pydantic>=1.3.*
aioflowdock aiohttp>=3.*
aioflowdock pyee>=6.*
aiohubot pyee<7,>=6.*
aiohubot aiohttp<4,>=3.*
airflow-ditto apache-airflow<=2.*,>=1.10.10
airflow-hdinsight apache-airflow<=2.*,>=1.10.10
airium requests<3,>=2.12.*; extra == "parse"
airium beautifulsoup4<5.0,>=4.10.*; extra == "parse"
amnes flake8-bugbear<21,>=20.*; extra == "dev"
amnes mkdocs-material<5.1,>=5.0.*; extra == "dev"
animask opencv-python>=4.1.0.*
animask pygifsicle>=1.0.*
apdaemon psutil>=5.4.*
apispec-starlette apispec<=4.*,>=3.3.*
astrool astropy<4.*,>=3.0
astrool plotly<4.*,>=3.0
autogenes matplotlib>=3.0.*
autots pandas>=0.25.*
autots statsmodels>=0.10.*
autots scikit-learn>=0.20.*
autots fbprophet>=0.4.*; extra == "additional"
bdacore sphinx>=1.5.*; extra == "test"
bdacore sphinx-bootstrap-theme>=0.4.*; extra == "test"
bdacore nbsphinx>=0.2.*; extra == "test"
bdacore sphinx-gallery>=0.1.*; extra == "test"
binderhub kubernetes>=4.*
blog PyYAML>=5.1.*
blog Jinja2>=2.10.*
blog Markdown>=3.1.*
blog Pygments>=2.4.*
blog pymdown-extensions>=6.*
blog pyembed-markdown>=1.1.*
blog docopt>=0.6.*
boml tensorflow<=1.15.*,>=1.13.*
chooser wxPython>=4.0.*
codecomb numpy>=1.16.*
coreir hwtypes>=1.0.*
dagster-gcp google-cloud-bigquery<3,>=1.19.*
dantro sphinx-book-theme>=0.3.*; extra == "dev"
dantro sphinx-book-theme>=0.3.*; extra == "doc"
deriver pandas>=1.0.*
dgenies matplotlib>=2.1.*
dgenies Markdown>=2.6.*
dgenies python-crontab==2.*,>=2.2.*
directory-healthcheck django<3.3.*,>=1.11.22
django-calaccess-processed-data django>=4.0.*
django-calaccess-raw-data django>=4.0.*
django-calaccess-raw-data django-postgres-copy>=2.6.*
django-calaccess-scraped-data django>=3.2.*
django-gcloud-connectors django<=3.3.*,>=2.0
django-on-chain django<=4.0.*,>=2.2.*
django-saml-idp Django>=1.9.*
dropbox stone>=2.*
eapt pygeoip>=0.*
eapt pycurl>=7.*.*.*
eapt haversine>=2.*.*
evolutionary-keras tensorflow>2.1*
excel2xx mako>=1.1.*
fan-tools rest-framework-dyn-serializer>=1.3.*; extra == "doc_utils"
fastapi-plugins fastapi>=0.74.*
fastapi-plugins tenacity>=8.0.*
fastapi-plugins python-json-logger>=2.0.*
fastapi-plugins redis>=4.3.*
fastapi-plugins aiojobs>=1.0.*
fastapi-plugins fastapi>=0.74.*; extra == "all"
fastapi-plugins tenacity>=8.0.*; extra == "all"
fastapi-plugins python-json-logger>=2.0.*; extra == "all"
fastapi-plugins redis>=4.3.*; extra == "all"
fastapi-plugins aiojobs>=1.0.*; extra == "all"
fastapi-plugins aiomcache>=0.7.*; extra == "all"
fastapi-plugins fastapi>=0.74.*; extra == "fakeredis"
fastapi-plugins tenacity>=8.0.*; extra == "fakeredis"
fastapi-plugins python-json-logger>=2.0.*; extra == "fakeredis"
fastapi-plugins redis>=4.3.*; extra == "fakeredis"
fastapi-plugins aiojobs>=1.0.*; extra == "fakeredis"
fastapi-plugins fakeredis>=1.8.*; extra == "fakeredis"
fastapi-plugins fastapi>=0.74.*; extra == "memcached"
fastapi-plugins tenacity>=8.0.*; extra == "memcached"
fastapi-plugins python-json-logger>=2.0.*; extra == "memcached"
fastapi-plugins redis>=4.3.*; extra == "memcached"
fastapi-plugins aiojobs>=1.0.*; extra == "memcached"
fastapi-plugins aiomcache>=0.7.*; extra == "memcached"
fastapi-plugins fastapi>=0.74.*; extra == "test"
fastapi-plugins tenacity>=8.0.*; extra == "test"
fastapi-plugins python-json-logger>=2.0.*; extra == "test"
fastapi-plugins redis>=4.3.*; extra == "test"
fastapi-plugins aiojobs>=1.0.*; extra == "test"
fastapi-plugins aiomcache>=0.7.*; extra == "test"
fastapi-plugins fakeredis>=1.8.*; extra == "test"
feast googleapis-common-protos<2,>=1.52.*
feast PyYAML<7,>=5.4.*
feast dask<2022.02.0,>=2021.*
feast google-cloud-datastore<3,>=2.1.*; extra == "ci"
feast google-cloud-storage<3,>=1.34.*; extra == "ci"
feast google-cloud-datastore<3,>=2.1.*; extra == "dev"
feast google-cloud-storage<3,>=1.34.*; extra == "dev"
feast google-cloud-datastore<3,>=2.1.*; extra == "docs"
feast google-cloud-storage<3,>=1.34.*; extra == "docs"
feast google-cloud-datastore<3,>=2.1.*; extra == "gcp"
feast google-cloud-storage<3,>=1.34.*; extra == "gcp"
firelab tb-nightly>=1.14.*
flange jsonschema>=3.*
fsleyes jinja2>=2.*
fsleyes-props fsleyes-widgets>=0.6.*
fslgui nibabel>=2.3.*
gitir-download pytest<=4.*; extra == "dev"
gluonts rpy2<3.*,>=2.9.*; extra == "r"
gluonts pyarrow>=6.*; python_version == "3.6.*" and extra == "arrow"
gluonts pyarrow>=6.*; python_version == "3.6.*" and extra == "dev"
gluonts pyarrow>=6.*; python_version == "3.6.*" and extra == "pro"
good-first-issues pytest<=4.*; extra == "dev"
hepdata-lib PyYAML>4.*
hicexplorer numpy>=1.15.*
hicexplorer scipy>=1.1.*
hicexplorer matplotlib>2.2.*
hicexplorer tables>=3.4.*
hicexplorer pandas>=0.23.*
hicexplorer pyBigWig>=0.3.*
hicexplorer six>=1.11.*
hicexplorer future>=0.17.*
hicexplorer jinja2>=2.10.*
hicexplorer unidecode>=1.0.*
hicmatrix numpy>=1.16.*
hicmatrix scipy>=1.2.*
hicmatrix tables>=3.5.*
hicmatrix pandas>=0.25.*
hicmatrix intervaltree>=3.0.*
httpx-ntlm httpx>=0.21.*
i2t2 fastscript>=0.1.*
i2t2 ipykernel>=5.2.*
i2t2 ipython>=7.13.*
i2t2 jupyter>=1.0.*
i2t2 jupyterlab>=2.0.*
i2t2 matplotlib>=3.2.*
i2t2 nbdev>=0.2.*
i2t2 numpy>=1.18.*
i2t2 pandas>=1.0.*
i2t2 pillow>=7.1.*
i2t2 pydicom>=1.4.*
i2t2 twine>=3.1.*
i2t2 scipy>=1.4.*
i2t2 h5py>=2.10.*
jhub-authenticators jupyterhub>=3.*
jhub-swarmspawner docker>=5.0.*
jhub-swarmspawner jupyterhub>=3.*
jhub-swarmspawner flatten-dict>=0.4.*
jhub-swarmspawner jhub-authenticators>=0.3.*
jhub-swarmspawner traitlets>=5.3.*
json2python-models python-dateutil>=2.7.*
json2python-models inflection>=0.3.*
json2python-models unidecode>=1.0.*
json2python-models Jinja2>=2.10.*
json2python-models typing-extensions>=3.1.*
ldap-hooks ldap3>=2.5.*
ldap-hooks traitlets>=5.3.*
ldap-hooks gen>=0.*
ldap-hooks tornado>=6.0.*
lemay-ai-sidecar pandas>=0.24.*
lemay-ai-sidecar tensorflow<1.14.*,>=1.11.*
lemay-ai-sidecar numpy>=1.16.*
lusidtools lusid-sdk-preview>=0.11.*
maccabistats setuptools>=28.*
matmov pandas<2.*,>=1.1.2
matmov numpy<2.*,>=1.19.2
matmov matplotlib<4.*,>=3.3.2
mieaa requests>=2.19.*
mip gurobipy>=8.*; extra == "gurobi"
mlx-jira-juggler python-dateutil<3.*,>=2.8.0
mlx-jira-juggler natsort<8.*,>=7.1.0
mlx-traceability Sphinx<6.*,>=2.1
mlx-traceability matplotlib<4.*
mlx-warnings junitparser<2.*,>=1.0.0
nkocr opencv-contrib-python>=4.*
node-conformity numpy>=1.15.*
node-conformity tqdm>=4.20.*
nomeroff-net numpy>=1.16.*
nomeroff-net imgaug>=0.4.*
ocelot-materials numpy>=1.*
ocelot-materials pandas>=0.24.*
ocelot-materials scipy>=1.*
ocelot-molecular numpy>=1.*
ocelot-molecular pandas>=0.24.*
ocelot-molecular scipy>=1.*
ocelot-quantum numpy>=1.*
ocelot-quantum pandas>=0.24.*
ocelot-quantum scipy>=1.*
openergy python-slugify<2.*,>=1.2.1
orange3-imageanalytics numpy>=1.16.*
orange3-imageanalytics-dda numpy>=1.16.*
pjlsa cmmnbuild-dep-manager<3.*,>=2.5.0
pjlsa jpype1<2.*,>=1.0.2
pjlsa cmmnbuild-dep-manager<3.*,>=2.5.0; extra == "all"
pjlsa jpype1<2.*,>=1.0.2; extra == "all"
pjlsa cmmnbuild-dep-manager<3.*,>=2.5.0; extra == "core"
pjlsa jpype1<2.*,>=1.0.2; extra == "core"
pretty-format-json data-process>=0.3.*
prospecting uritemplate>=3.*
pulsar-client protobuf<=3.20.*,>=3.6.1; extra == "all"
pulsar-client protobuf<=3.20.*,>=3.6.1; extra == "functions"
pyawsutils pytrustplatform>=0.13.*
pyddapi six>=1.10.*
pyddapi psycopg2-binary>=2.6.*
pyddapi nbconvert<=5.4.*; extra == "test"
pyddapi sphinx>=1.5.*; extra == "test"
pyddapi sphinx-bootstrap-theme>=0.4.*; extra == "test"
pyddapi nbsphinx>=0.2.*; extra == "test"
pyddapi sphinx-gallery>=0.1.*; extra == "test"
pygeostat matplotlib>=2.2.*
pylabrad pyOpenSSL>=16.2.*
pylabrad pyparsing>=2.1.*
pylabrad twisted>=16.0.*
pylabrad futures>=3.0.*; python_version < "3"
pylabrad numpy>=1.12.*; python_version < "3.7"
pylabrad numpy>=1.15.*; python_version == "3.7"
pylabrad numpy>=1.17.*; python_version >= "3.8"
pyquant-ms scipy>=0.18.*
pytest-httpx pytest<8.*,>=6.*
pythainlp nltk>=3.3.*; extra == "full"
pythainlp nltk>=3.3.*; extra == "wordnet"
pytorch-lightning torch>=1.9.*
pytorch-lightning torchtext>=0.10.*; extra == "all"
pytorch-lightning torchvision>=0.10.*; extra == "all"
pytorch-lightning torchtext>=0.10.*; extra == "dev"
pytorch-lightning torchvision>=0.10.*; extra == "examples"
pytorch-lightning torchtext>=0.10.*; extra == "extra"
pytrustplatform pykitcommander>=2.3.2*
receptivefield pillow>=6.2.*
receptivefield matplotlib>=3.1.*
receptivefield numpy>=1.17.*
redexpect redssh>=2*
redexpect redssh>=2*; extra == "docs"
redexpect redssh>=2*; extra == "tests"
robotframework-jenkins python-jenkins>=1.*
robotframework-jenkins robotframework>=3.*
robotframework-jenkins requests>=2.*
s3like marshmallow>=3.*
stonky teletype>=1.*
stwfsapy scikit-learn>=0.24.*
superai protobuf<4.*,>=3.20.1; extra == "ai"
superai protobuf<4.*,>=3.20.1; extra == "complete"
superai protobuf<4.*,>=3.20.1; extra == "test"
telluric fiona<2.*,>=1.8.4
telluric shapely<2.*,>=1.6.3
teroshdl yowasp-yosys>=0.8.*
textract extract-msg<=0.29.*
thonny-microbit thonny<3.2.*,>=3.0.0
thonny-pi thonny<3.2.*,>=3.0.0
uplink-httpx httpx>=0.12.*
uplink-httpx uplink>=0.9.*
wfuzz pyparsing>=2.4*; python_version >= "3.5"
xkcd-wrapper requests<2.25.*,>=2.23.*; extra == "sync"
mistex mistune>=2.0.*
taktile-profiling numpy<2,>=1.21.*
fedot ete3>=3.1.*
fedot numpy>=1.19.*
fedot pytest>=6.2.*
fedot anytree>=2.8.*
fedot typing>=3.7.*
fedot Pillow>=8.2.*
fedot seaborn>=0.9.*
fedot joblib>=0.17.*
fedot SALib>=1.3.*
fedot deap>=1.3.*
fedot lightgbm>=2.3.*
fedot catboost>=0.25.*
fedot testfixtures>=6.18.*
fedot requests>=2.*
flask-requestpreprocessor Flask>=1.1.*
blizz nbsphinx>=0.7.*; extra == "docs"
blizz pytest>=6.2.*; extra == "testing"
blizz pytest-cov>=2.10.*; extra == "testing"
blizz flake8>=3.8.*; extra == "testing"
blizz flake8-comprehensions>=3.3.*; extra == "testing"
blizz isort>=5.7.*; extra == "testing"
lazuli protobuf<4.0.*,>=3.2.*
geotiff zarr>=2.10.*
insolver h2o>=3.36.0.*
insolver django>=3.2.*; python_version >= "3.8"
libpyka beautifulsoup4>=4.9.*
libpyka chardet>=4.*
libpyka cssselect>=1.*
libpyka requests>=2.*
libpyka types-chardet>=0.*
libpyka types-requests>=0.1.*
lmdirect authlib<1.*,>=0.15.5
reqwrapper requests>=2.*
endeless numpy>=1.17.*
fastface pytorch-lightning>=1.1.*
fastface scipy>=1.*.*
mlflow-openshift mlflow>=1.13.*
mlflow-openshift numpy>=1.19.*
mlflow-openshift openshift-client>=1.0.*
pychu pydantic<2.*,>=1.7.3
xgbse pandas>=1.0.*
xgbse pandas>=1.0.*; extra == "all"
kelvin-app pyarrow>=3.0.*; extra == "tests"
bluewhale3-imageanalytics numpy>=1.16.*
iotprovision pyedbglib>=2.17.*
iotprovision pymcuprog>=3.7.*
iotprovision pydebuggerupgrade>=3.4.*
iotprovision pykitcommander>=2.6.4.*
iotprovision pytrustplatform>=0.15.*
iotprovision pyawsutils>=0.11.10.*
iotprovision pyazureutils>=0.8.*
iotprovision pydebuggerconfig>=3.8.3.*
matomo requests>=2.*
aiotodoist aiohttp<4.*,>=3.*
aiotodoist todoist-python>=8.*
demcompare xarray>=0.13.*
metdig meteva>1.3.*
polars pyarrow>=4.0.*; extra == "pyarrow"
polars pyarrow>=4.0.*; extra == "pandas"
pulsar-client-sn protobuf<=3.20.*,>=3.6.1; extra == "all"
pulsar-client-sn protobuf<=3.20.*,>=3.6.1; extra == "functions"
amazon-textract-helper Pillow>=9.2.*
amazon-textract-helper PyPDF2>=2.5.*
amazon-textract-overlayer Pillow>=9.2.*
amazon-textract-overlayer PyPDF2>=2.5.*
flask-openapi3 pydantic<2.*,>=1.2
pyaml-env PyYAML<=6.*,>=5.*
flask-gatekeeper Flask>=1.1.*
bodo pandas<1.5,>=1.3.*
amazon-textract-pipeline-pagedimensions Pillow>=9.2.*
amazon-textract-pipeline-pagedimensions PyPDF2>=2.5.*
ccdc-opencivicdata Django>=4.0.*
img2text colorama>=0.4.*
nbmanips cloudpickle>=1.6.*
nbmanips click>=7.1.*
nbmanips Pygments>=2.10.*
nbmanips colorama>=0.4.*
nbmanips beautifulsoup4>=4.10.*
ptlflow einops<=0.4.*,>=0.3.0
ptlflow numpy<=1.22.*,>=1.17.0
ptlflow opencv-python<=4.6.*,>=4.0.0.21
ptlflow packaging<=21.*,>=20.0
ptlflow pandas<=1.4.*,>=1.1.0
ptlflow pillow<=9.2.*,>=5.0
ptlflow plotly<=5.9.*,>=5.0.0
ptlflow pytorch-lightning!=1.3.*,!=1.4.*,<=1.6.*,>=1.1.0
ptlflow requests<=2.28.*,>=2.0.0
ptlflow scipy<=1.9.*,>=1.0.0
ptlflow torch<=1.12.*,>=1.8.1
ptlflow torchmetrics<=0.9.*,>=0.2
ptlflow torchvision<=0.13.*,>=0.9.2
ptlflow tqdm<=4.64.*,>=4.41.0
sqlfileexecutor psycopg2>=2.*
sqlfileexecutor libpyka>=0.*
sqlfileexecutor requests>=2.*
sqlfileexecutor click>=8.*
fsqlexec psycopg2>=2.*
fsqlexec libpyka>=0.*
fsqlexec requests>=2.*
fsqlexec click>=8.*
django-sca-helper django>=2.1.*
medical-shape torch>=1.7.*
torchsde numpy>=1.19.*; python_version >= "3.7"
as-ws-wrapper zeep>=4.0.*
fortes-webservice-wrapper zeep>=4.0.*
jntajis-python flake8>=3.9.*; extra == "dev"
jntajis-python jinja2>=3.*; extra == "dev"
jntajis-python pytest>=6.2.*; extra == "dev"
jntajis-python sphinx>=4.*; extra == "dev"
jntajis-python sphinx-rtd-theme>=0.5.*; extra == "dev"
knarrow importlib-metadata>=3.9.*; python_version != "3.10"
knarrow importlib-metadata<3.9.*; python_version == "3.10"
tables-io numpy<1.22.*; python_version < "3.8"
tables-io astropy<5.*; python_version < "3.8"
tables-io pandas<1.4.*; python_version < "3.8"
amaranth amaranth-yosys>=0.10.*; extra == "builtin-yosys"
cuquantum-python cuquantum>=22.7.*
dj-cloud-task google-cloud-tasks>=2.5.*
django3-livesync watchdog>=2.*
django3-livesync tornado>=6.*
dpm360-lightsaber scikit-learn>=1.*
dpm360-lightsaber pytorch-lightning>=1.*
dpm360-lightsaber ray>=1.13.*
fancy-sa-filemodel SQLAlchemy>=1.4.*
lightning-nets torch>=1.7.*
mlvisualizationtools dash-bootstrap-components>=1.0.0*; extra == "dash"
stubgenj JPype1<2.*,>=1.2.1
stubgenj JPype1<2.*,>=1.2.1; extra == "all"
stubgenj JPype1<2.*,>=1.2.1; extra == "core"
actorch ray<2.*,>=1.13.0
cegalprizm-investigator cegalprizm-hub<2,>=1.*
cegalprizm-pythontoolpro cegalprizm-hub<2,>=1.*
marshmallow-sa-core SQLAlchemy>=1.4.0.*
micropipelines numpy<=1.22.*
pipkin filelock>=3.0.*
timetracker-cli2 click>=8.0.*
timetracker-cli2 dateparser>=1.1.*
timetracker-cli2 requests>=2.27.*
timetracker-cli2 rich>=11.1.*
mk-feature-store Click>=7.*
mk-feature-store PyYAML>=5.4.*
mk-feature-store tenacity>=7.*
mk-feature-store dask<2022.02.0,>=2021.*
mk-feature-store google-cloud-datastore>=2.1.*; extra == "ci"
mk-feature-store google-cloud-storage<1.41,>=1.34.*; extra == "ci"
mk-feature-store google-cloud-datastore>=2.1.*; extra == "dev"
mk-feature-store google-cloud-storage<1.41,>=1.34.*; extra == "dev"
mk-feature-store google-cloud-datastore>=2.1.*; extra == "gcp"
mk-feature-store google-cloud-storage<1.41,>=1.34.*; extra == "gcp"
cegalprizm-scripting-server cegalprizm-hub<2,>=1.*
ednaml torch>=1.10.*
ednaml torchvision>=0.11.*
ednaml Pillow>=9.0.*
ednaml tqdm>=4.63.*
elemeno-ai-feast PyYAML>=5.4.*
elemeno-ai-feast tenacity>=7.*
elemeno-ai-feast dask<2022.02.0,>=2021.*
elemeno-ai-feast google-cloud-datastore>=2.1.*; extra == "ci"
elemeno-ai-feast google-cloud-storage<1.41,>=1.34.*; extra == "ci"
elemeno-ai-feast google-cloud-datastore>=2.1.*; extra == "dev"
elemeno-ai-feast google-cloud-storage<1.41,>=1.34.*; extra == "dev"
elemeno-ai-feast google-cloud-datastore>=2.1.*; extra == "gcp"
elemeno-ai-feast google-cloud-storage<1.41,>=1.34.*; extra == "gcp"
finetuning-scheduler torch>=1.9.*
gocd-tools requests>=2.27.*
gocd-tools PyYAML>=5.*
hikari-toolkit uncertainties>=3.*
moai-hydra-searchpath-plugin moai-mdk>=0.1.*
polars-u64-idx pyarrow>=4.0.*; extra == "pandas"
polars-u64-idx pyarrow>=4.0.*; extra == "pyarrow"
pysequansutils pyedbglib>=2.19.3.*
pysequansutils pykitcommander>=2.6.3.*
timeeval scikit-learn>=0.24.*
dataloop-upipe numpy<=1.22.*
galahad sortedcontainers>==2.4.*
galahad scikit-learn>=0.24.*; extra == "all"
galahad scikit-learn>=0.24.*; extra == "contrib"
galahad scikit-learn>=0.24.*; extra == "sklearn"
mdade torch>=1.7.*
pymoode numpy>=1.19.*
pymoode scipy>=1.7.*
rp-tagger sqlalchemy>=1.4.*
rp-tagger flask>=1.1.*
rstar pyarrow>=4.0.*; extra == "pandas"
rstar pyarrow>=4.0.*; extra == "pyarrow"
termfactory numpy>=1.18.*
transtab pandas>=1.3.*
betty-ml torch>=1.6.*
betty-ml numpy>=1.9.*
geopolars pyarrow>=4.0.*; extra == "pandas"
geopolars pyarrow>=4.0.*; extra == "pyarrow"
pruby uncertainties>=3.*
scresonators-fit matplotlib>=3.0.*
scrfit matplotlib>=3.0.*
torchde torch>=1.7.*
polars-lts-cpu pyarrow>=4.0.*; extra == "pyarrow"
polars-lts-cpu pyarrow>=4.0.*; extra == "pandas"
togglreports requests>=2.25.*
togglreports datetime>=2.7.*
togglreports argparse>=1.3.*
spd-eda pandas>=1.4.*
spd-eda xlsxwriter>=3.0.*
spd-eda pyodbc>=4.0.*
spd-eda seaborn>=0.12.*
spd-eda scipy>=1.9.*
spd-eda awswrangler>=2.16.*
spyglass-neuro jupyterlab>=3.*
spyglass-neuro pydotplus>=2.0.*
spyglass-neuro pymysql>=1.0.*
torchfl torch<1.12.0,>=1.11.*
Actually, though, it doesn’t look like the current behaviour of packaging is correct anyway:
>>> Version("1.0") in SpecifierSet("<=1.0")
True
>>> Version("1.0") in SpecifierSet("<=1.0.*")
False
>>> Version("1.0") in SpecifierSet("==1.0.*")
True
I don’t think this behaviour is “obvious”, so surely even if we decide do permit the “obvious” equivalent (as @pradyunsg suggested), those projects would be broken anyway (and it would be a silent breakage, which is worse than an easily actionable error message).