Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有外部依赖的Python中实现类似C的无符号int 32?_Python - Fatal编程技术网

如何在没有外部依赖的Python中实现类似C的无符号int 32?

如何在没有外部依赖的Python中实现类似C的无符号int 32?,python,Python,我需要一个类,该类将保留Python的int类的所有功能,但确保其结果在32位整数内,就像在C编程语言中一样。类型必须是“有毒的”-对int执行操作,此类型应返回此类型。正如其中一个答案中所建议的那样,我曾经为此使用numpy.uint32,但是仅仅为一个相对简单的类型添加如此大的依赖项感觉太傻了。我如何做到这一点?以下是我迄今为止的尝试: MODULO = 7 # will be 2**32 later on class u32: def __init__(self, num =

我需要一个类,该类将保留Python的
int
类的所有功能,但确保其结果在32位整数内,就像在C编程语言中一样。类型必须是“有毒的”-对int执行操作,此类型应返回此类型。正如其中一个答案中所建议的那样,我曾经为此使用
numpy.uint32
,但是仅仅为一个相对简单的类型添加如此大的依赖项感觉太傻了。我如何做到这一点?以下是我迄今为止的尝试:

MODULO = 7  # will be 2**32 later on

class u32:
    def __init__(self, num = 0, base = None):
        print(num)
        if base is None:
            self.int = int(num) % MODULO
        else:
            self.int = int(num, base) % MODULO
    def __coerce__(self, x):
        return None
    def __str__(self):
        return "<u32 instance at 0x%x, int=%d>" % (id(self), self.int)
    def __getattr__(self, x):
        r = getattr(self.int, x)
        if callable(r):
            def f(*args, **kwargs):
                ret = r(*args, **kwargs) % MODULO
                print("x=%s, args=%s, kwargs=%s, ret=%s" % (x, args, kwargs, ret))
                if x not in ['__str__', '__repr__']:
                    return u32(ret)
                return r(*args, **kwargs)
            return f
        return r

u = u32(4)
print("u/2")
a = u * 2
assert(isinstance(a, u32))

print("\n2/u")
a = 2 * u
assert(isinstance(a, u32))

print("\nu+u")
"""
Traceback (most recent call last):
  File "u32.py", line 44, in <module>
    a = u + u
  File "u32.py", line 18, in f
    ret = r(*args, **kwargs) % MODULO
TypeError: unsupported operand type(s) for %: 'NotImplementedType' and 'int'
"""
a = u + u
assert(isinstance(a, u32))
MODULO=7#稍后将为2**32
u32类:
定义初始化(self,num=0,base=None):
打印(个)
如果base为None:
self.int=int(num)%MODULO
其他:
self.int=int(num,base)%MODULO
定义强制(self,x):
一无所获
定义(自我):
返回“”%(id(self),self.int)
def uu getattr uu(self,x):
r=getattr(self.int,x)
如果可调用(r):
def f(*args,**kwargs):
ret=r(*args,**kwargs)%MODULO
打印(“x=%s,args=%s,kwargs=%s,ret=%s”%(x,args,kwargs,ret))
如果x不在['''''''''.'报告'.''中:
返回u32(ret)
返回r(*args,**kwargs)
返回f
返回r
u=u32(4)
打印(“u/2”)
a=u*2
断言(isinstance(a,u32))
打印(“\n2/u”)
a=2*u
断言(isinstance(a,u32))
打印(“\nu+u”)
"""
回溯(最近一次呼叫最后一次):
文件“u32.py”,第44行,在
a=u+u
文件“u32.py”,第18行,在f中
ret=r(*args,**kwargs)%MODULO
TypeError:不支持%:“NotImplementedType”和“int”的操作数类型
"""
a=u+u
断言(isinstance(a,u32))

显然正确的方法是编写所有特殊方法(这可能会很痛苦)

否则,请为您的
\uuuu getattr\uuuuu

def __getattr__(self, x):
    r = getattr(self.int, x)
    if callable(r):
        def f(*args, **kwargs):
            if args and isinstance(args[0], u32):
                args = (args[0].int, ) + args[1:]
            ret = r(*args, **kwargs)
            if ret is NotImplemented:
                return ret
            if x in ['__str__', '__repr__', '__cmp__', '__index__']:
                return ret
            ret %= MODULO
            return u32(ret)
        return f
    return r

正如Martijn所指出的,这只适用于旧式类。有关适用于新样式类的方法,请参阅。

是否需要内存存储或兼容性?兼容性。我需要能够将一些公式从C复制到Python,它们依赖于溢出行为。除了“愚蠢”,为什么不使用
numpy
?很好的工作已经完成了,请大家欣赏。我宁愿将C编译代码保持在最低限度,所以我更愿意将这种类型保持在纯Python中。另外,我感兴趣的是它会是什么样子。你是否考虑过使用<代码> cType < /代码>?我已经尝试过没有%MoDo的版本。也有同样的问题。@d33tah:好的,试试这个。self.int=int(num)%MODULO TypeError:int()参数必须是字符串或数字,而不是“tuple”@d33tah:您还有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu强制方法吗?哪些操作会导致该错误?
struct.unpack()
返回一个元组