20 comments

[ 4.7 ms ] story [ 55.2 ms ] thread
I don't mean to be negative, but how is this better than just using the `2to3` tool that already ships with Python?
That's not negative. That's the first and possibly only question.

2to3 "works" on whole projects and I'm not sending my code whoknowswhere.

It's better for the people that operate the site because they get all of your Python code.
(comment deleted)
But this web-2to3 is monetised with ads. The python community didn't think of that.
They (the python community) doesn't require a library for left-padding. I don't think they will fall for this
Even the Jedi felt that burn.
I understand this is meant as a side-project for the author to learn new stuff. From his blog: "It’s an online tool that I built for myself, and I hope other people can get some use out of it, I hav ported a lot of code in pyhon2 to python3 and I thouhgt thatthis web can help other people and also, it was a good oportunity for my, because I learned javascript and bootstrap for do it."
I guess this is a sample project, that looks like a good portfolio piece, but for real applications it has all the downsides of an online tool and none of the upsides

I'll keep calling 2to3

  a = "test"
  if a < 1:
      print(a)
What about it?
If you enter the code above into the website it responds with:

maybe the code is wrong?

It does not do that for me, the Python 3 version appears with no changes.
"test" < 1 is a TypeError in python3, and it works in python2 (returns False), it is part of the pitfalls of porting code to python 3.
(comment deleted)
There are some corner cases that run fine in python but trip up 2to3 tools, including this web based one. This code for example:

  print(set(x for x in range(2),))
"asdf".encode("hex")

Is there a tool which knows to translate this to:

  import binascii
  binascii.b2a_hex(b"asdf")
Even worse, if the string isn't known to be a byte string or ASCII unicode string, it's something like:

  import binascii
  binascii.b2a_hex(s.encode("ascii") if isinstance(s, str) else s)
Sure...that's a different thing though. Python 3's choice to introduce new types and change behavior of existing types means no automated tool can really decide what to do.

The snippet I posted is a little different in that it runs on both Python 2 as well as 3, but the 2to3 tools choke on it.

Ahh, yes, you're right.

I'm still irritated by this specific case because my code and documentation used s.encode("hex") often, and it took a while to fix them all. Especially as the original code used both str and unicode hex-encoded values, so I couldn't drop in binascii. I ended up adding a C extension function.

What is a 2to3 tool supposed to do here?

python2 prints "set([0, 1])" while python3 prints "{0,1}".

Is it supposed to normalize the str() so it matches Python2?

For that matter, the str() for floats has changed:

  % python
  Python 2.7.10 (default, Jul 30 2016, 19:40:32)
  [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
  Type "help", "copyright", "credits" or "license" for more information.
  >>> print(-1.0000000000000002)
  -1.0
  >>>
  % python3
  Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
  [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
  Type "help", "copyright", "credits" or "license" for more information.
  >>> print(-1.0000000000000002)
  -1.0000000000000002