C python中的溢出int

C python中的溢出int,c,python-3.x,porting,integer-overflow,C,Python 3.x,Porting,Integer Overflow,我正在将Ian Bell的一部分精英从C转换为Python。C(ab)使用16位整数,这会导致溢出。Python使用神奇的Python整数,而不是。这是一个问题 我可以定义一个类UInt16:(更新:或使用ctype内置的UInt16),它的行为就像我希望的那样,但是我必须“强制”整个程序中的每个数字都是UInt16。我有没有办法告诉我的解释器“嘿,你知道Int?好吧,我想让你在你通常使用的每个地方都使用这个类。” 或者,如果做不到这一点,是否还有另一种简单的方法可以实现整数溢出?简短回答:不可

我正在将Ian Bell的一部分精英从C转换为Python。C(ab)使用16位整数,这会导致溢出。Python使用神奇的Python整数,而不是。这是一个问题

我可以定义一个
类UInt16:
(更新:或使用ctype内置的UInt16),它的行为就像我希望的那样,但是我必须“强制”整个程序中的每个数字都是
UInt16
。我有没有办法告诉我的解释器“嘿,你知道
Int
?好吧,我想让你在你通常使用的每个地方都使用这个类。”


或者,如果做不到这一点,是否还有另一种简单的方法可以实现整数溢出?

简短回答:不可能按照您的意愿覆盖默认整数行为


更长的回答:

首先,我们可以看到Python中存在几种16位无符号整数的实现:

  • 内置库
    ctypes
    16位无符号整数作为
    c\u uint16
  • Numpy库还包含
    unint16
  • 实现自己的uint16数据类型(带有运算符重载等)
  • 在Python中,我们是否可以使用这些或其他数据类型来覆盖默认整数的问题更为棘手

    假设用户使用
    int
    方法在程序中创建所有整数。如果是这种情况,那么我们可以包装int方法来创建无符号整数而不是正则整数:

    from ctypes import c_uint16
    _int = int
    
    def int(x):
        return c_uint16(x)
    
    例如,以下代码工作正常:

    a = int(1)
    
    我们可以检查:

    >>> type(a)
    <class 'ctypes.c_ushort'>
    

    在这种情况下,不会调用
    int
    方法,而是简单地将
    b
    赋值为
    1
    。我们希望做的是覆盖此行为,但不幸的是。

    简短回答:不可能像您希望的那样覆盖默认整数行为


    更长的回答:

    首先,我们可以看到Python中存在几种16位无符号整数的实现:

  • 内置库
    ctypes
    16位无符号整数作为
    c\u uint16
  • Numpy库还包含
    unint16
  • 实现自己的uint16数据类型(带有运算符重载等)
  • 在Python中,我们是否可以使用这些或其他数据类型来覆盖默认整数的问题更为棘手

    假设用户使用
    int
    方法在程序中创建所有整数。如果是这种情况,那么我们可以包装int方法来创建无符号整数而不是正则整数:

    from ctypes import c_uint16
    _int = int
    
    def int(x):
        return c_uint16(x)
    
    例如,以下代码工作正常:

    a = int(1)
    
    我们可以检查:

    >>> type(a)
    <class 'ctypes.c_ushort'>
    

    在这种情况下,不会调用
    int
    方法,而是简单地将
    b
    赋值为
    1
    。我们希望做的是也覆盖这种行为,但不幸的是。

    AFAIR这是不可能的。您希望使用内置类型,即

    扩展版

    整数文本(1,而不是int(“1”))始终是
    内置模块
    /
    \uuuu内置模块中的int类型(取决于python版本)。您要做的基本上是将
    unint16
    上的所有方法复制到int类(因为方法只是函数类型的属性)。在本例中,在您声明1的每个地方,都会得到一个类型为
    int
    的对象,其行为与
    unint16
    类似

    这在python中是不可能的。我认为,由于这一点,底层实现变得越来越容易,但这背后有更深层次的逻辑

    int
    是一个核心类,如
    list
    str
    object
    set
    dict
    tuple
    ,等等。假设有人创建了几乎所有人都会使用的非常方便的库。如果您曾经使用过Java,那么想象一下它对ApacheCommons或Spring的影响。事实上,每个有价值的人都会使用它,因为它使开发更快。现在,假设有人创建了fork,在他的公司内部使用,说他这样做是为了保持代码库的稳定,它有一小段代码,可以改变内置的
    对象
    行为,从而向他发送一些关键数据。他可以利用数百万用户的私人数据(地址、密码等等)欺骗他们。令人毛骨悚然的场景,对吧

    现在,这似乎不是很真实,但如果让最终用户评估python脚本呢?您可能见过内置python shell的文本编辑器(如gedit)或音乐播放器(Rhythmbox),为程序内部提供接口。现在,soemone以某种方式将
    对象的变化
    行为注入到您的机器中。另一个令人毛骨悚然的场景

    这些都是我想到的例子,我真的不记得python的创建者对它说了什么——这就是为什么我提供了进一步讨论的链接


    有点离题——这实际上可能导致一些优秀的库(“这”意味着“允许在内置程序上进行猴子补丁”)。想象一下,monkey修补所有Bultin,以便将它们存储在某个多处理管理器中。实际上,您可以获得基于多处理的java风格的多线程,并且可以以某种方式避免GIL。当然,还有很多其他原因说明这不是很好(“例如,多线程的幻觉不是多线程”),但我发现它对于简单的日常桌面脚本编写非常有用

    那是不可能的。您希望使用内置类型,即

    扩展版

    整数文本(1,而不是int(“1”))始终是
    内置模块
    /
    \uuuu内置模块中的int类型(取决于python版本)。您要做的基本上是将
    unint16
    上的所有方法复制到int类(因为方法只是函数类型的属性)。在这种情况下,在你所说的每一个地方,你都会得到一个典型的对象