コード例 #1
0
 def _iterencode(o, _current_indent_level):
     if isinstance(o, str):
         yield _encoder(o)
     elif o is None:
         yield 'null'
     elif o is True:
         yield 'true'
     elif o is False:
         yield 'false'
     elif isinstance(o, int):
         # see comment for int/float in _make_iterencode
         yield convert2Es6Format(o)
     elif isinstance(o, float):
         # see comment for int/float in _make_iterencode
         yield convert2Es6Format(o)
     elif isinstance(o, (list, tuple)):
         yield from _iterencode_list(o, _current_indent_level)
     elif isinstance(o, dict):
         yield from _iterencode_dict(o, _current_indent_level)
     else:
         if markers is not None:
             markerid = id(o)
             if markerid in markers:
                 raise ValueError("Circular reference detected")
             markers[markerid] = o
         o = _default(o)
         yield from _iterencode(o, _current_indent_level)
         if markers is not None:
             del markers[markerid]
コード例 #2
0
 def _iterencode_list(lst, _current_indent_level):
     if not lst:
         yield '[]'
         return
     if markers is not None:
         markerid = id(lst)
         if markerid in markers:
             raise ValueError("Circular reference detected")
         markers[markerid] = lst
     buf = '['
     if _indent is not None:
         _current_indent_level += 1
         newline_indent = '\n' + _indent * _current_indent_level
         separator = _item_separator + newline_indent
         buf += newline_indent
     else:
         newline_indent = None
         separator = _item_separator
     first = True
     for value in lst:
         if first:
             first = False
         else:
             buf = separator
         if isinstance(value, str):
             yield buf + _encoder(value)
         elif value is None:
             yield buf + 'null'
         elif value is True:
             yield buf + 'true'
         elif value is False:
             yield buf + 'false'
         elif isinstance(value, int):
             # Subclasses of int/float may override __str__, but we still
             # want to encode them as integers/floats in JSON. One example
             # within the standard library is IntEnum.
             yield buf + convert2Es6Format(value)
         elif isinstance(value, float):
             # see comment above for int
             yield buf + convert2Es6Format(value)
         else:
             yield buf
             if isinstance(value, (list, tuple)):
                 chunks = _iterencode_list(value, _current_indent_level)
             elif isinstance(value, dict):
                 chunks = _iterencode_dict(value, _current_indent_level)
             else:
                 chunks = _iterencode(value, _current_indent_level)
             yield from chunks
     if newline_indent is not None:
         _current_indent_level -= 1
         yield '\n' + _indent * _current_indent_level
     yield ']'
     if markers is not None:
         del markers[markerid]
コード例 #3
0
def verify(ieeeHex, expected):
    while len(ieeeHex) < 16:
        ieeeHex = '0' + ieeeHex
    value = struct.unpack('>d',binascii.a2b_hex(ieeeHex))[0]
    try:
        pyFormat = convert2Es6Format(value)
    except ValueError:
        if expected == INVALID_NUMBER:
            return
    if pyFormat == expected and value == float(pyFormat) and repr(value) == str(value):
        return
    print('IEEE:   ' + ieeeHex + '\nPython: ' + pyFormat + '\nExpected: ' + expected)
    exit(0)
コード例 #4
0
# value in ieee hex representation (1-16 digits) + ',' + correct ES6 format + '\n'
#
f = open('c:\\es6\\numbers\\es6testfile100m.txt','rb')
l = 0;
string = '';
while True:
    byte = f.read(1);
    if len(byte) == 0:
        exit(0)
    if byte == b'\n':
        l = l + 1;
        i = string.find(',')
        if i <= 0 or i >= len(string) - 1:
            print('Bad string: ' + str(i))
            exit(0)
        hex = string[:i]
        while len(hex) < 16:
            hex = '0' + hex
        value = struct.unpack('>d',binascii.a2b_hex(hex))[0]
        es6Format = string[i + 1:]
        pyFormat = convert2Es6Format(value)
        if pyFormat != es6Format or value != float(pyFormat) or repr(value) != str(value):
            print('IEEE:   ' + hex + '\nPython: ' + str(value) + '\nES6/V8: ' + es6Format)
            exit(0)
        string = ''
        if l % 1000000 == 0:
            print(l)
    else:
        string += byte.decode(encoding='UTF-8')

コード例 #5
0
 def _iterencode_dict(dct, _current_indent_level):
     if not dct:
         yield '{}'
         return
     if markers is not None:
         markerid = id(dct)
         if markerid in markers:
             raise ValueError("Circular reference detected")
         markers[markerid] = dct
     yield '{'
     if _indent is not None:
         _current_indent_level += 1
         newline_indent = '\n' + _indent * _current_indent_level
         item_separator = _item_separator + newline_indent
         yield newline_indent
     else:
         newline_indent = None
         item_separator = _item_separator
     first = True
     if _sort_keys:
         items = sorted(dct.items(),
                        key=lambda kv: kv[0].encode('utf-16_be'))
     else:
         items = dct.items()
     for key, value in items:
         if isinstance(key, str):
             pass
         # JavaScript is weakly typed for these, so it makes sense to
         # also allow them.  Many encoders seem to do something like this.
         elif isinstance(key, float):
             # see comment for int/float in _make_iterencode
             key = convert2Es6Format(key)
         elif key is True:
             key = 'true'
         elif key is False:
             key = 'false'
         elif key is None:
             key = 'null'
         elif isinstance(key, int):
             # see comment for int/float in _make_iterencode
             key = convert2Es6Format(key)
         elif _skipkeys:
             continue
         else:
             raise TypeError("key " + repr(key) + " is not a string")
         if first:
             first = False
         else:
             yield item_separator
         yield _encoder(key)
         yield _key_separator
         if isinstance(value, str):
             yield _encoder(value)
         elif value is None:
             yield 'null'
         elif value is True:
             yield 'true'
         elif value is False:
             yield 'false'
         elif isinstance(value, int):
             # see comment for int/float in _make_iterencode
             yield convert2Es6Format(value)
         elif isinstance(value, float):
             # see comment for int/float in _make_iterencode
             yield convert2Es6Format(value)
         else:
             if isinstance(value, (list, tuple)):
                 chunks = _iterencode_list(value, _current_indent_level)
             elif isinstance(value, dict):
                 chunks = _iterencode_dict(value, _current_indent_level)
             else:
                 chunks = _iterencode(value, _current_indent_level)
             yield from chunks
     if newline_indent is not None:
         _current_indent_level -= 1
         yield '\n' + _indent * _current_indent_level
     yield '}'
     if markers is not None:
         del markers[markerid]