0

I tried sub-classing the built-in int object along the lines of this example but I got a strange error.

Here is the code and resulting Traceback.

# Built-in namespace
import __builtin__
# Extended subclass
class myint(int):
 def in_words(self):
 if self:
 return 'one million'
 else:
 return ''
# Substitute the original int with the subclass on the built-in namespace 
__builtin__.int = myint

(I was planning to write a method to return an integer as a series of words like on a cheque).

Just executing this definition code causes the following:

Traceback (most recent call last):
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/ipykernel/ipkernel.py", line 175, in do_execute
 shell.run_cell(code, store_history=store_history, silent=silent)
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2917, in run_cell
 self.execution_count += 1
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/traitlets/traitlets.py", line 450, in __set__
 new_value = self._validate(obj, value)
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/traitlets/traitlets.py", line 471, in _validate
 value = self.validate(obj, value)
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/traitlets/traitlets.py", line 1266, in validate
 self.error(obj, value)
 File "/Users/billtubbs/anaconda/lib/python2.7/site-packages/traitlets/traitlets.py", line 499, in error
 raise TraitError(e)
TraitError: The 'execution_count' trait of a ZMQInteractiveShell instance must be an integer, but a value of 2 <type 'int'> was specified.
asked Dec 2, 2015 at 0:20

1 Answer 1

2

You can subclass a builtin type, the problem comes with you try to replace a built-in type. This is a chicken and egg problem.

As a golden rule, never replace builtins. If you never want to use an int again in YOUR PROGRAM, then do int = myint and call it good. Don't touch __builtin__.int

The specific error here is IPython doing some validation and checking if type(foo) is int, which fails. If they'd done isinstance(foo, int) it would have succeeded. Be a conscientious coder -- don't muck with the internals that other modules are using.

answered Dec 2, 2015 at 0:23
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.