diff --git a/tutorial/py.twisted/PythonClient.py b/tutorial/py.twisted/PythonClient.py
index e80c0fc..63dde7e 100755
--- a/tutorial/py.twisted/PythonClient.py
+++ b/tutorial/py.twisted/PythonClient.py
@@ -19,51 +19,53 @@
 # under the License.
 #
 
-import sys, glob
+import glob
+import sys
 sys.path.append('gen-py.twisted')
 sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])
 
 from tutorial import Calculator
-from tutorial.ttypes import *
+from tutorial.ttypes import InvalidOperation, Operation, Work
 
 from twisted.internet.defer import inlineCallbacks
 from twisted.internet import reactor
 from twisted.internet.protocol import ClientCreator
 
-from thrift import Thrift
 from thrift.transport import TTwisted
 from thrift.protocol import TBinaryProtocol
 
+
 @inlineCallbacks
 def main(client):
-  yield client.ping()
-  print('ping()')
+    yield client.ping()
+    print('ping()')
 
-  sum = yield client.add(1,1)
-  print(('1+1=%d' % (sum)))
+    sum = yield client.add(1, 1)
+    print(('1+1=%d' % (sum)))
 
-  work = Work()
+    work = Work()
 
-  work.op = Operation.DIVIDE
-  work.num1 = 1
-  work.num2 = 0
+    work.op = Operation.DIVIDE
+    work.num1 = 1
+    work.num2 = 0
 
-  try:
-    quotient = yield client.calculate(1, work)
-    print('Whoa? You know how to divide by zero?')
-  except InvalidOperation as e:
-    print(('InvalidOperation: %r' % e))
+    try:
+        quotient = yield client.calculate(1, work)
+        print('Whoa? You know how to divide by zero?')
+        print('FYI the answer is %d' % quotient)
+    except InvalidOperation as e:
+        print(('InvalidOperation: %r' % e))
 
-  work.op = Operation.SUBTRACT
-  work.num1 = 15
-  work.num2 = 10
+    work.op = Operation.SUBTRACT
+    work.num1 = 15
+    work.num2 = 10
 
-  diff = yield client.calculate(1, work)
-  print(('15-10=%d' % (diff)))
+    diff = yield client.calculate(1, work)
+    print(('15-10=%d' % (diff)))
 
-  log = yield client.getStruct(1)
-  print(('Check log: %s' % (log.value)))
-  reactor.stop()
+    log = yield client.getStruct(1)
+    print(('Check log: %s' % (log.value)))
+    reactor.stop()
 
 if __name__ == '__main__':
     d = ClientCreator(reactor,
diff --git a/tutorial/py.twisted/PythonServer.py b/tutorial/py.twisted/PythonServer.py
index c578321..1b0e2d5 100755
--- a/tutorial/py.twisted/PythonServer.py
+++ b/tutorial/py.twisted/PythonServer.py
@@ -19,12 +19,13 @@
 # under the License.
 #
 
-import sys, glob
+import glob
+import sys
 sys.path.append('gen-py.twisted')
 sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])
 
 from tutorial import Calculator
-from tutorial.ttypes import *
+from tutorial.ttypes import InvalidOperation, Operation
 
 from shared.ttypes import SharedStruct
 
@@ -33,61 +34,63 @@
 
 from thrift.transport import TTwisted
 from thrift.protocol import TBinaryProtocol
-from thrift.server import TServer
+
 
 class CalculatorHandler:
-  implements(Calculator.Iface)
-  def __init__(self):
-    self.log = {}
+    implements(Calculator.Iface)
 
-  def ping(self):
-    print('ping()')
+    def __init__(self):
+        self.log = {}
 
-  def add(self, n1, n2):
-    print('add(%d,%d)' % (n1, n2))
-    return n1+n2
+    def ping(self):
+        print('ping()')
 
-  def calculate(self, logid, work):
-    print('calculate(%d, %r)' % (logid, work))
+    def add(self, n1, n2):
+        print('add(%d,%d)' % (n1, n2))
+        return n1 + n2
 
-    if work.op == Operation.ADD:
-      val = work.num1 + work.num2
-    elif work.op == Operation.SUBTRACT:
-      val = work.num1 - work.num2
-    elif work.op == Operation.MULTIPLY:
-      val = work.num1 * work.num2
-    elif work.op == Operation.DIVIDE:
-      if work.num2 == 0:
-        x = InvalidOperation()
-        x.whatOp = work.op
-        x.why = 'Cannot divide by 0'
-        raise x
-      val = work.num1 / work.num2
-    else:
-      x = InvalidOperation()
-      x.whatOp = work.op
-      x.why = 'Invalid operation'
-      raise x
+    def calculate(self, logid, work):
+        print('calculate(%d, %r)' % (logid, work))
 
-    log = SharedStruct()
-    log.key = logid
-    log.value = '%d' % (val)
-    self.log[logid] = log
+        if work.op == Operation.ADD:
+            val = work.num1 + work.num2
+        elif work.op == Operation.SUBTRACT:
+            val = work.num1 - work.num2
+        elif work.op == Operation.MULTIPLY:
+            val = work.num1 * work.num2
+        elif work.op == Operation.DIVIDE:
+            if work.num2 == 0:
+                x = InvalidOperation()
+                x.whatOp = work.op
+                x.why = 'Cannot divide by 0'
+                raise x
+            val = work.num1 / work.num2
+        else:
+            x = InvalidOperation()
+            x.whatOp = work.op
+            x.why = 'Invalid operation'
+            raise x
 
-    return val
+        log = SharedStruct()
+        log.key = logid
+        log.value = '%d' % (val)
+        self.log[logid] = log
 
-  def getStruct(self, key):
-    print('getStruct(%d)' % (key))
-    return self.log[key]
+        return val
 
-  def zip(self):
-    print('zip()')
+    def getStruct(self, key):
+        print('getStruct(%d)' % (key))
+        return self.log[key]
+
+    def zip(self):
+        print('zip()')
 
 if __name__ == '__main__':
     handler = CalculatorHandler()
     processor = Calculator.Processor(handler)
     pfactory = TBinaryProtocol.TBinaryProtocolFactory()
-    server = reactor.listenTCP(9090,
-                TTwisted.ThriftServerFactory(processor,
-                pfactory), interface="127.0.0.1")
+    server = reactor.listenTCP(
+        9090,
+        TTwisted.ThriftServerFactory(processor, pfactory),
+        interface="127.0.0.1")
     reactor.run()
diff --git a/tutorial/py.twisted/PythonServer.tac b/tutorial/py.twisted/PythonServer.tac
index 08493ff..0479636 100755
--- a/tutorial/py.twisted/PythonServer.tac
+++ b/tutorial/py.twisted/PythonServer.tac
@@ -22,12 +22,14 @@
 from twisted.application import internet, service
 from thrift.transport import TTwisted
 
-import sys, glob
+import glob
+import sys
 sys.path.append('gen-py.twisted')
 sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])
 from tutorial import Calculator
-from tutorial.ttypes import *
 from PythonServer import CalculatorHandler
+from thrift.protocol import TBinaryProtocol
+
 
 def make_application():
     application = service.Application('CalcServer')
@@ -35,8 +37,9 @@
     handler = CalculatorHandler()
     processor = Calculator.Processor(handler)
 
-    serverFactory = TTwisted.ThriftServerFactory(processor,
-                                 TBinaryProtocol.TBinaryProtocolFactory())
+    serverFactory = TTwisted.ThriftServerFactory(
+        processor,
+        TBinaryProtocol.TBinaryProtocolFactory())
 
     calcService = internet.TCPServer(9090, serverFactory)
 
@@ -46,4 +49,5 @@
 
     return application
 
-application = make_application()
+if __name__ == '__main__':
+    application = make_application()
