This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2014年07月28日 21:58 by Florian.Dold, last changed 2022年04月11日 14:58 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| bug-ctypes-slots.py | Florian.Dold, 2014年07月28日 21:58 | test case | ||
| issue22098.patch | Claudiu.Popa, 2014年08月25日 09:39 | review | ||
| Messages (7) | |||
|---|---|---|---|
| msg224195 - (view) | Author: Florian Dold (Florian.Dold) | Date: 2014年07月28日 21:58 | |
Habimg __slots__ = [] on a class inheriting from ctypes.Structure prevents undefined fields from being set, as expected. When inheriting from ctypes.BigEndianStructure, however, it is possible to set undefined fields. See the attached file for small test case for the behavior. |
|||
| msg225658 - (view) | Author: PCManticore (Claudiu.Popa) * (Python triager) | Date: 2014年08月22日 11:07 | |
That makes sense. Quoting from the data model: "When inheriting from a class without __slots__, the __dict__ attribute of that class will always be accessible, so a __slots__ definition in the subclass is meaningless". In the current case, for the little-endian systems, which I presume you have, BigEndianStructure is a subclass of Structure, but it doesn't have a definition of __slots__ in the body, leading to your results, according to the specificaton from the data model. In this case, it makes sense for Point1 to have __slots__, but not for Point2. |
|||
| msg225674 - (view) | Author: Eryk Sun (eryksun) * (Python triager) | Date: 2014年08月22日 14:58 | |
Since BigEndianStructure doesn't explicitly define the instance slots, they get the default slots for __dict__ and __weakref__. It wouldn't make sense to exclude these slots from instances of the Point2 subclass, so there's no mechanism for that. You can only add slots. That said, the BigEndianStructure and LittleEndianStructure subclasses should define __slots__ = (). That removes the inconsistency. http://hg.python.org/cpython/file/c0e311e010fc/Lib/ctypes/_endian.py#l46 |
|||
| msg225675 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2014年08月22日 15:02 | |
> That said, the BigEndianStructure and LittleEndianStructure subclasses should define __slots__ = (). That removes the inconsistency. That would probably be reasonable indeed. Anyone wants to write a patch? |
|||
| msg225870 - (view) | Author: PCManticore (Claudiu.Popa) * (Python triager) | Date: 2014年08月25日 09:39 | |
Here's a short patch. |
|||
| msg225872 - (view) | Author: Antoine Pitrou (pitrou) * (Python committer) | Date: 2014年08月25日 13:56 | |
Thanks Claudiu, the patch looks good to me. |
|||
| msg226096 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2014年08月29日 22:39 | |
New changeset c499cc2c4a06 by Antoine Pitrou in branch 'default': Issue #22098: ctypes' BigEndianStructure and LittleEndianStructure now define an empty __slots__ so that subclasses don't always get an instance dict. http://hg.python.org/cpython/rev/c499cc2c4a06 |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:58:06 | admin | set | github: 66296 |
| 2021年10月23日 21:13:08 | yaubi | set | nosy:
- yaubi |
| 2014年08月29日 22:39:40 | pitrou | set | status: open -> closed resolution: fixed stage: commit review -> resolved |
| 2014年08月29日 22:39:10 | python-dev | set | nosy:
+ python-dev messages: + msg226096 |
| 2014年08月29日 05:23:15 | Claudiu.Popa | set | stage: patch review -> commit review |
| 2014年08月25日 13:56:29 | pitrou | set | messages: + msg225872 |
| 2014年08月25日 09:39:18 | Claudiu.Popa | set | files:
+ issue22098.patch keywords: + patch messages: + msg225870 stage: needs patch -> patch review |
| 2014年08月22日 15:02:42 | pitrou | set | versions:
+ Python 3.5, - Python 3.4 nosy: + pitrou, belopolsky, amaury.forgeotdarc, meador.inge messages: + msg225675 stage: needs patch |
| 2014年08月22日 14:58:41 | eryksun | set | nosy:
+ eryksun messages: + msg225674 |
| 2014年08月22日 11:07:51 | Claudiu.Popa | set | nosy:
+ Claudiu.Popa messages: + msg225658 |
| 2014年07月29日 02:51:43 | yaubi | set | nosy:
+ yaubi |
| 2014年07月28日 21:59:24 | Florian.Dold | set | type: behavior |
| 2014年07月28日 21:58:29 | Florian.Dold | create | |