今天处理某段代码时,发现要处理vesting_shares
与delegated_vesting_shares
的差值,但是这两个值读回来的amount
都是字符串。
(图源 :pixabay)
以我自己的账户为例,读取vesting_shares
与delegated_vesting_shares
返回如下:
其中amount
为整数,表示总数量;precision
精度表示精确到小数点后边的位数,也就是amount
值的后6位是小数点后的数值。
因为我们处理后还是以上述方式表示,精度也还一样,所以处理加减法只需加减amount
的数值即可,但是需要先把字符串型数据转换成数值型数据。
把字符串转换成整数非常简单,var = int(str_val)
即可,当我这样做之后,程序运行一如我期望的一样,没出任何BUG。不过我突然想起来好像还有一个long()
函数,把字符串转换成长整型,而int
、long
都是有长度限制的,而vesting_shares
的amount
值又很大,那么会不会出现超限溢出的问题呢?
Python 3 下 int 类型
当我尝试使用类似这样的方式时,var =long(str_val)
时,我被提示如下信息:
NameError: name 'long' is not defined
而当我查看Python 3的内置函数列表时(Built-in Functions),发现long()
并不存在:
而在Built-in Types中,我们会发现,数值类型( Numeric Types)只有int
、 float
、complex
三种。
那么long
哪去了呢?还好在Porting Extension Modules to Python 3:long/int Unification中发现了端倪:
Python 3 has only one integer type, int(). But it actually corresponds to Python 2’s long() type—the int() type used in Python 2 was removed. In the C-API, PyInt_* functions are replaced by their PyLong_* equivalents.
也就是说,Python 3只有一个整数类型:int()
,但是其实是对应Python 2中的long()
类型,Python 2中原本的int()
被移除了。
另外,在数值类型( Numeric Types)中有这样一句话:
Integers have unlimited precision
也就是说,Python3中的int
类型可以存储无限长度的整数类型(当然了,受限于内存和硬盘的存储空间,不可能真的无限大),所以我根本不用担心之前代码的溢出问题。
Python 2下int类型
另外,特意测试了一下Python 2(Python 2.7.9)下这个问题,发现还挺有意思的。我特意找了个32位的系统,先来用platform.architecture()
看一下系统架构:
然后用sys.maxint
看一下最大的整型数据是多少:
然后做如下测试:
也就是说,长度不够时,会自动升类型?好神奇。不过我还是用Python3就好,一种类型总比两种类型省心多了。