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.
Community
  • 1
  • 1
Bill
  • 10,323
  • 10
  • 62
  • 85

1 Answers1

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.

Adam Smith
  • 52,157
  • 12
  • 73
  • 112