如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

d33tah

我需要一个可以保留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))
伊森·弗曼(Ethan Furman)

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

否则,请为您尝试 __getattr__

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所指出的,这仅适用于老式类。请参阅他的答案以获取适用于新型类的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

来自分类Dev

在C中构造32位unsigned int

来自分类Dev

C# int & int32 声明

来自分类Dev

如何通过UnsafePointer <Int32>创建Int32?

来自分类Dev

'tensorflow'没有属性'to_int32'

来自分类Dev

如何模拟Int32溢出?

来自分类Dev

int32存储在内存中

来自分类Dev

C#Int32:m_value

来自分类Dev

在Haskell中实现FSharp的Int32.TryParse

来自分类Dev

如何以标准/便携式和高效的方式编写int64 = int32 * int32?

来自分类Dev

“ int64var = int32var * int32var”中的计算未按预期溢出。为什么?

来自分类Dev

无法在Swift中调用采用int的ObjC方法,因为Int32无法转换为Int

来自分类Dev

如何在Swift中将Int32写入NSOutputStream

来自分类Dev

C# 中的一些奇怪的东西 - UInt32 vs Int32

来自分类Dev

MySQL int列映射到Int64。如何使其映射到Int32(即int)?

来自分类Dev

无法总结所有 Int32 字段值

来自分类Dev

Int32如何使运算符重载?

来自分类Dev

如何使用ctypes获得32位int的前11位

来自分类Dev

如何快速将Int32值转换为CGFloat?

来自分类Dev

Python:未堆叠的DataFrame太大,导致int32溢出

来自分类Dev

Python Packing int32但不起作用?

来自分类Dev

Python 2.7要签名的int32的字节列表

来自分类Dev

在Swift中要为int32 pixelFormat输入什么?

来自分类Dev

在Int32数组中快速使用sizeof

来自分类Dev

mingw32中的Double到int隐式转换

来自分类Dev

Crystal中的Int32 vs Float64性能

来自分类Dev

在 PHP 中解压签名的 int32 little-endian

来自分类Dev

将 int32 转换为 dart 中的字节列表

来自分类Dev

C ++仅更改__int64变量的低32位

Related 相关文章

热门标签

归档