Hacker News new | ask | show | jobs
by 4c2383f5c88e911 3225 days ago

  a = "test"
  if a < 1:
      print(a)
2 comments

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
What about it?
"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.
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.