[Tutor] ReadableInt

Steven D'Aprano steve at pearwood.info
Fri Dec 30 19:28:09 EST 2016


On Fri, Dec 30, 2016 at 04:46:26PM +0000, Albert-Jan Roskam wrote:
> Hi,
> 
> 
> Why does the call to str() below return '1' and not 'one'? 

Because the literals 1, 2, 3 etc are hard-coded in the interpreter to 
return objects of type `int`. Shadowing the name in the builtins module 
doesn't change the type of object the literals return.

# Python 2.7

py> import __builtin__
py> class MyInt(int):
...     pass
...
py> __builtin__.int = MyInt
py> type(int("12"))
<class '__main__.MyInt'>
py> type(12)
<type 'int'>


Python 3 is the same, except you would import `builtins` instead of 
`__builtin__`. (Do not use `__builtins__` with an "s".)


So I'm afraid that unfortunately, or perhaps fortunately, there's no way 
to do what you are trying to do. You would have to modify the Python 
interpreter itself.


> Should I implement __new__ because int is immutable?

That won't help.


> I have a datafile that 
> contains values and an associated metadata file with the associated 
> labels. I need to recode the values. Because just using the values is 
> a bit error prone I would like to see the associated labels while 
> debugging.

Can you be a little more specific about what you are doing? Wouldn't you 
be recoding the values of a datafile using an external editor?

 How stupid is the code below on a scale from 1-10? Remember 
> I only intend to use it while debugging the given script.

> Btw, initially I hoped to be able to do this with the (newish) pandas dtype 'category', but unless
> I am overlooking something, but this does not seem possible:
> 
> 
> >>> import pandas as pd
> >>> pd.Categorical.from_codes([1, 2], ["one", "two"], ordered=True)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "C:\Users\Albert-Jan\AppData\Local\Programs\Python\Python35-32\lib\site-p
> ackages\pandas\core\categorical.py", line 471, in from_codes
>     raise ValueError("codes need to be between -1 and "
> ValueError: codes need to be between -1 and len(categories)-1
> >>> pd.Categorical.from_codes([0, 1], ["one", "two"], ordered=True)
> [one, two]
> Categories (2, object): [one < two]

I don't understand what I'm reading there, or what you're attempting to 
accomplish.



-- 
Steve


More information about the Tutor mailing list