Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork34.2k
gh-143715: Deprecate incomplete initialization of struct.Struct()#145580
gh-143715: Deprecate incomplete initialization of struct.Struct()#145580serhiy-storchaka wants to merge 29 commits intopython:mainfrom
Conversation
* ``Struct.__new__()`` will require a mandatory argument (format)* Calls of ``__init__()`` method on initialized Struct are deprecated
This make format argument in the __init__() - optional. If it'smissing, the object must be already initialized in __new__().
Co-authored-by: Victor Stinner <vstinner@python.org>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This catch current pattern for Struct's subclassing likeclass MyStruct(Struct): def __init__(self): super().__init__('>h')| :meth:`~object.__init__` method on initialized:class:`~struct.Struct` | ||
| objects is deprecated and will be removed in Python 3.20. | ||
| (Contributed by Sergey B Kirpichev in:gh:`143715`.) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
| (Contributed bySergey B Kirpichev in:gh:`143715`.) | |
| (Contributed bySerhiy Storchaka in:gh:`143715`.) |
| :meth:`~object.__init__` method on initialized :class:`~struct.Struct` | ||
| objects is deprecated and will be removed in Python 3.20. | ||
| (Contributed by Sergey B Kirpichev in :gh:`143715`.) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
| (Contributed bySergey B Kirpichev in:gh:`143715`.) | |
| (Contributed bySerhiy Storchaka in:gh:`143715`.) |
| def check_sizeof(self, format_str, number_of_codes): | ||
| # The size of 'PyStructObject' | ||
| totalsize = support.calcobjsize('2n3P') | ||
| totalsize = support.calcobjsize('2n3P1?') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
| totalsize=support.calcobjsize('2n3P1?') | |
| totalsize=support.calcobjsize('2n3P?') |
| super().__init__('>h') | ||
| my_struct = MyStruct('>h') | ||
| self.assertEqual(my_struct.pack(12345), b'\x30\x39') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I think this will be more clear, per Victor's suggestion:
| self.assertEqual(my_struct.pack(12345),b'\x30\x39') | |
| self.assertEqual(my_struct.format,'>h') |
(and in all cases below too)
| def __init__(self, *args, **kwargs): | ||
| super().__init__('>h') | ||
| my_struct = MyStruct('>h') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Why this not raises a warning? I think we should warn in all cases, whereStruct.__init__() was explicitly called. //#143659 (comment)
| my_struct = MyStruct('>h') | ||
| self.assertEqual(my_struct.pack(12345), b'\x30\x39') | ||
| my_struct = MyStruct(format='>h') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Ah, I entirely forgot thatformat is a positional or keyword argument in the master. I'll fix my patch.
But again, this should emit a warning.
| # New way, no warnings: | ||
| class MyStruct(struct.Struct): | ||
| def __new__(cls, newargs, initargs): | ||
| return super().__new__(cls, *newargs) | ||
| def __init__(self, newargs, initargs): | ||
| if initargs is not None: | ||
| super().__init__(*initargs) | ||
| my_struct = MyStruct(('>h',), ('>h',)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Again, why no warnings here?
BTW, I doubt this usage pattern come from reality ;-)
Uh oh!
There was an error while loading.Please reload this page.
Struct.__new__()will require a mandatory argument (format)__init__()method on initialized Struct are deprecatedThis is an evolution of#143659, but since virtually all code and test were rewritten I created a new PR.
📚 Documentation preview 📚:https://cpython-previews--145580.org.readthedocs.build/