mirror of
https://github.com/python/cpython.git
synced 2025-10-07 07:31:46 +00:00
Issue #29300: Convert _struct module to Argument Clinic
* The struct module now requires contiguous buffers. * Convert most functions and methods of the _struct module to Argument Clinic * Use "Py_buffer" type for the "buffer" argument. Argument Clinic is responsible to create and release the Py_buffer object. * Use "PyStructObject *" type for self to avoid explicit conversions. * Add an unit test on the _struct.Struct.unpack_from() method to test passing arguments as keywords. * Rephrase docstrings. * Rename "fmt" argument to "format" in docstrings and the documentation. As a side effect, functions and methods which used METH_VARARGS calling convention like struct.pack() now use the METH_FASTCALL calling convention which avoids the creation of temporary tuple to pass positional arguments and so is faster. For example, struct.pack("i", 1) becomes 1.56x faster (-36%):: $ ./python -m perf timeit \ -s 'import struct; pack=struct.pack' 'pack("i", 1)' \ --compare-to=../default-ref/python Median +- std dev: 119 ns +- 1 ns -> 76.8 ns +- 0.4 ns: 1.56x faster (-36%) Significant (t=295.91) Patch co-written with Serhiy Storchaka.
This commit is contained in:
parent
fd6d0d2a18
commit
3f2d10132d
4 changed files with 540 additions and 239 deletions
|
@ -412,6 +412,10 @@ class StructTest(unittest.TestCase):
|
|||
for i in range(6, len(test_string) + 1):
|
||||
self.assertRaises(struct.error, struct.unpack_from, fmt, data, i)
|
||||
|
||||
# keyword arguments
|
||||
self.assertEqual(s.unpack_from(buffer=test_string, offset=2),
|
||||
(b'cd01',))
|
||||
|
||||
def test_pack_into(self):
|
||||
test_string = b'Reykjavik rocks, eow!'
|
||||
writable_buf = array.array('b', b' '*100)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue