[pypy-issue] Issue #3026: struct format does not support space in struct.py (pypy/pypy)
Aure at bitbucket.org
Aure at bitbucket.org
Mon Jun 10 03:53:25 EDT 2019
New issue 3026: struct format does not support space in struct.py
https://bitbucket.org/pypy/pypy/issues/3026/struct-format-does-not-support-space-in
Aurélien Lambert:
While trying to import pytz in brython \(which is using pypy pure python implementation of libraries\), I encountered a bug on `struct.py` \([https://bitbucket.org/pypy/pypy/src/18626459a9b2/lib\_pypy/\_struct.py](https://bitbucket.org/pypy/pypy/src/18626459a9b2/lib_pypy/_struct.py)\): spaces are not allowed in the format string. This behavior is inconsistent with python documentation \(“Whitespace characters between formats are ignored;”\) and does not happen with the compiled struct module.
```python
from test.struct import calcsize # local copy of pypy struct.py
calcsize('>4s c 15x 6l') # format from pytz
>>> StructError: is not a valid format
```
This is due to the functions `getmode` and `getNum` not checking for whitespaces. This implementation of `getNum` gets rid of middle spaces.
```python
def getNum(fmt,i):
num=None
cur = fmt[i]
while cur == ' ':
i += 1
cur = fmt[i]
while ('0'<= cur ) and ( cur <= '9'):
if num == None:
num = int(cur)
else:
num = 10*num + int(cur)
i += 1
cur = fmt[i]
return num,i
```
Getting rid of end spaces will be little trickier because all the function use `getNum` like this:
```python
while i<len(fmt):
num,i = getNum(fmt,i)
cur = fmt[i]
[...]
i += 1
```
I suggest either to systematically use `fmt = fmt.rstrip()`, either to change the behavior of `getNum`
```python
def getNum(fmt,i):
num=None
cur = fmt[i]
while cur == ' ':
i += 1
cur = fmt[i]
while ('0'<= cur ) and ( cur <= '9'):
if num == None:
num = int(cur)
else:
num = 10*num + int(cur)
i += 1
cur = fmt[i]
i += 1
while i < len(fmt) and fmt[i] == ' ':
i += 1
return num,i,cur
```
And use it like this
```python
while i<len(fmt):
num,i,cur = getNum(fmt,i)
[...]
```
More information about the pypy-issue
mailing list