Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chapter7: Support both Python 2 and Python 3 #6

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/chapter7/breakfast.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from __future__ import print_function
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @cclauss actually jython supports print() without the import from __future__, at least in 2.7

C:\Users\Adam\jython\jython4>dist\bin\jython.exe
Jython 2.7.2a1+ (, May 9 2019, 11:51:47)
[OpenJDK 64-Bit Server VM (Oracle Corporation)] on java11.0.1
Type "help", "copyright", "credits" or "license" for more information.
>>> print('hi')
hi
>>>

That should make the change less verbose. Thanks for taking the time to submit this and the other v3 compatibility PRs.

Copy link
Author

@cclauss cclauss May 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Python porting best practice says that we should prevent compatibility regressions. This import changes the way that Python 2 operates so that print statements are now syntax errors while print() function continues to work as expected. This prevents Python 2 developers from writing code that breaks compatibility with Python 3.

Proof:

  • $ python2 -c "print 'This works...'"
  • $ python2 -c "from __future__ import print_function ; print '...but this raises a syntax error.'"

The import is also required in any print statement that contains an unquoted comma.

$ python2

>>> print "hello", "world"
hello world
>>> print("hello", "world")
('hello', 'world')

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for explaining. I can see the systematic logic to this and understand why it is in the porting guidelines now. I think there is still a decision around its impact on inline explanations in a reference book, as Jeff points out.

While on the topic it is also unfortunately a jython bug with __future__.print_function() when using from an interactive console which might compound confusion.

https://bugs.jython.org/issue2007

class Spam(object):

def order(self, number):
print "spam " * number
print("spam " * number)

def order_eggs():
print " and eggs!"
print(" and eggs!")

s = Spam()
s.order(3)
Expand Down
3 changes: 2 additions & 1 deletion src/chapter7/greet/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
print "in greet/__init__.py"
from __future__ import print_function
print("in greet/__init__.py")
5 changes: 3 additions & 2 deletions src/chapter7/greet/hello.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
print "in greet/hello.py"
from __future__ import print_function
print("in greet/hello.py")
import people

class Greeter(object):
def hello_all(self):
for name in people.names:
print "hello %s" % name
print("hello %s" % name)
3 changes: 2 additions & 1 deletion src/chapter7/greet/people.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
print "in greet/people.py"
from __future__ import print_function
print("in greet/people.py")

names = ["Josh", "Jim", "Victor", "Leo", "Frank"]
3 changes: 2 additions & 1 deletion src/chapter7/greetings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
print "in greeting.py"
from __future__ import print_function
print("in greeting.py")
import greet.hello

g = greet.hello.Greeter()
Expand Down