-
Notifications
You must be signed in to change notification settings - Fork 472
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
Python 3.13 error: cannot inherit frozen dataclass from a non-frozen one #1969
Comments
Steps to reproduce: cd /tmp
git clone https://github.com/hgrecco/pint
cd pint
python3.13 -m venv venv
# Or for me that was:
# ~/.pyenv/versions/3.13-dev/bin/python -m venv venv
source venv/bin/activate
python -m pip install pytest
python -m pip install -e .
pytest |
It's possible this issue is related: See cPython commit: python/cpython@b6000d2 |
I think this is the code that the trackback complains about: pint/pint/delegates/txt_defparser/common.py Lines 15 to 25 in f2e4081
And yes, Lines 105 to 115 in f2e4081
|
Modifying diff --git a/pint/errors.py b/pint/errors.py
index 59d3b45..f080f52 100644
--- a/pint/errors.py
+++ b/pint/errors.py
@@ -81,12 +81,12 @@ class WithDefErr:
return DefinitionError(self.name, self.__class__, msg)
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class PintError(Exception):
"""Base exception for all Pint errors."""
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class DefinitionError(ValueError, PintError):
"""Raised when a definition is not properly constructed."""
@@ -102,7 +102,7 @@ class DefinitionError(ValueError, PintError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class DefinitionSyntaxError(ValueError, PintError):
"""Raised when a textual definition has a syntax error."""
@@ -115,7 +115,7 @@ class DefinitionSyntaxError(ValueError, PintError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class RedefinitionError(ValueError, PintError):
"""Raised when a unit or prefix is redefined."""
@@ -130,7 +130,7 @@ class RedefinitionError(ValueError, PintError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class UndefinedUnitError(AttributeError, PintError):
"""Raised when the units are not defined in the unit registry."""
@@ -150,13 +150,13 @@ class UndefinedUnitError(AttributeError, PintError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class PintTypeError(TypeError, PintError):
def __reduce__(self):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class DimensionalityError(PintTypeError):
"""Raised when trying to convert between incompatible units."""
@@ -183,7 +183,7 @@ class DimensionalityError(PintTypeError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class OffsetUnitCalculusError(PintTypeError):
"""Raised on ambiguous operations with offset units."""
@@ -208,7 +208,7 @@ class OffsetUnitCalculusError(PintTypeError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class LogarithmicUnitCalculusError(PintTypeError):
"""Raised on inappropriate operations with logarithmic units."""
@@ -233,7 +233,7 @@ class LogarithmicUnitCalculusError(PintTypeError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class UnitStrippedWarning(UserWarning, PintError):
msg: str
@@ -241,13 +241,13 @@ class UnitStrippedWarning(UserWarning, PintError):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class UnexpectedScaleInContainer(Exception):
def __reduce__(self):
return self.__class__, tuple(getattr(self, f.name) for f in fields(self))
-@dataclass(frozen=False)
+@dataclass(frozen=True)
class UndefinedBehavior(UserWarning, PintError):
msg: str |
I've also run into this today. I applied @simonw's suggested change and the tests all passed. Is that the appropriate fix? |
Can we please get this fixed so that I can start testing with Python 3.13 before it is released? |
In trying to ship a PR for this I found the following problem:
I'm surprised that only showed up in |
I've stopped working on this - I hope someone else can figure it out. |
Python 3.13 was released today - https://docs.python.org/3.13/whatsnew/3.13.html - any chance of a compatible Pint release? |
The root cause here appears to be this bug fix in Python:
Fixing that bug exposed that Pint was relying on the buggy behaviour. |
I can confirm pinning flexparser<0.4 works in our CI |
See hgrecco/pint#1969 (comment) - flexparser had a new release incompatible with the current release of pint.
Should pint have upper flexparser e.g. |
pint / py13 problems reported in hgrecco/pint#1969 (comment)
Literally read the previous reply |
I think the point is that pint should already have been using an upper constraint on flexparser. |
I mean, it would have avoided this issue here, but my point isn’t that it should have been restricted, and more that going forward, should it now be restricted, so it doesn’t happen again? |
See hgrecco/pint#1969 (comment) - flexparser had a new release incompatible with the current release of pint.
I apologize for the inconvenience. In relation to upper version limits, I think the comment here also makes sense: hgrecco/flexparser#12 (comment) While I am open for discussion, I think this type of changes will not happen very often. This change was needed due to a modification in Python 3.13 of the semantics of frozen dataclasses. Dataclasses appeared in Python 3.7, 6 years ago, and I considered this stable enough to be used in something as fundamental as exceptions. This was not the case and came back to bite me!. Anyway, I will release a bug fix of Pint and we tackle this in another issue. |
Upper bounds on a library's dependencies are usually not a good idea, so I'd be -1 on that: without the upper bound people can do something about the breaking change by pinning So I'd much rather follow the advice quoted in the TL;DR of the article I linked to:
|
I just pushed Pint 0.24.4. If everything is fine, It will be in PyPI shortly. |
I am closing this issue as is fixed in Pint 0.24.4 Please let me know if you encounter any problem. |
Thanks so much for the quick fix! It works. |
Generally my rule of thumb for upper bounds are:
This case hits all three. The extremely over-long article you posted actually agrees with this evaluation btw, calling it the "best" reason to cap:
|
And the update has hit conda-forge now also: conda-forge/pint-feedstock#73 So I think all is good. Thank you for fixing! |
See hgrecco/pint#1969 (comment) - flexparser had a new release incompatible with the current release of pint.
* conversion of timeseries changed to mixed np array creation * omit dtype * fix handling of arrays, only allow numerical data in puts for eval. * precommit * f * fix * test * pre-commit * pre-commit * unpin numpy again and set printing behaviour to np-1.25 * line width 120 chars in year 2024 just seems to be right * format * add py313 to test matrix * remove py313 * update dependencies pint / py13 problems reported in hgrecco/pint#1969 (comment) * fmt * allow pre-commit fix * update deps --------- Co-authored-by: Çağtay Fabry <[email protected]>
Running Pint against the current Python 3.13 developer preview throws this error:
The text was updated successfully, but these errors were encountered: