• Jérome Perrin's avatar
    py2/py3: Make Products code compatible with both python2 and python3. · e7b9cbbd
    Jérome Perrin authored
    * Zope API changes:
      + publish():
        - stdin is now BytesIO rather than StringIO.
        - Returned value of a script is passed to str() in python2, not in python3 anymore.
      + HTTPResponse `body` property is now bytes().
      + OFS.Image.File file parameter is bytes().
      + zope.interface implements() is now @implementer decorator.
      + Python standard logging module recommended instead of zLOG.
    * Python3 API changes:
      + builtin reduce() was removed.
      + urlnorm is now available.
      + Use BytesIO rather than StringIO to follow py3 API.
      + hmac.new() requires digestmod argument from Python 3.8.
      + Use six.moves library to handle moved objects from py2 to py3.
      + `modernize -f xrange_six` then slightly adjusted manually to just use range
         where it does not make a significant difference (for example in test).
      + base64.b64encode() now expects bytes().
      + UserDict() interface changed:
        - New parameter in update() and pop().
        - `failobj` setdefault parameter renamed to `default`.
      + ensure_list() on dict.{values,items}() and list(dict) for dict.keys() when
        we really need a list and not an iterable (Python3).
      + Make dict iteration works on both version of Python.
        - Use six.iter{items,values,keys}().
        - has_key() has been removed.
        - Make sure that dict.{items,values,keys}() returns a real list when
        modified (ensure_list()).
      + Comparisons between int and NoneType raises TypeError.
        + BTrees key must be str() not int() (_getOb()).
      + No more unbound methods in python3 so use six.get_unbound_function().
      + Exceptions:
        - No longer behave as sequences. Using `args` attribute instead.
        - When an exception has been assigned using `as target`, it is cleared at
          the end of the except clause.
      + file: py2 was returning `str` upon reading, now it returns text strings.
        Also, opening mode is text strings by default.
      + Data strings are bytes().
        - Replace str() by bytes().
      + iterators no longer have next() method, instead there is next() builtin.
      + New ConnectionError exception so rename existing one to not clash.
      + Integer division is now with //.
      + __nonzero__ is now __bool__.
      + apply() does not exist anymore.
      + Deprecated threading.Thread isAlive() has been removed.
      + im_func replaced by __func__.
      + Use six.with_metaclass() to define metaclass in a cross-compatible way with py2 and py3.
      + Only test method can be marked as expectedFailure(), not assert statement anymore.
      + os.path.walk() removed.
      + HTMLParser never fails: no strict mode nor HTMLParseError anymore (Python #15114).
      + Unpickler.find_global() is now Unpickler.find_class().
    Co-Authored-by: Kazuhiko Shiozaki's avatarKazuhiko SHIOZAKI <kazuhiko@nexedi.com>
    Co-Authored-by: Arnaud Fontaine's avatarArnaud Fontaine <arnaud.fontaine@nexedi.com>
    Co-Authored-by: Carlos Ramos Carreño's avatarCarlos Ramos Carreño <carlos.ramos@nexedi.com>
    Co-Authored-by: Emmy Vouriot's avatarEmmeline Vouriot <emmeline.vouriot@nexedi.com>
    e7b9cbbd
FormToXML.py 3.78 KB