Как реализовать C-like unsigned int 32 в Python без внешних зависимостей?

Мне нужен класс, который сохранит все функции 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)) 

One Solution collect form web for “Как реализовать C-like unsigned int 32 в Python без внешних зависимостей?”

Очевидно, правильный метод состоит в том, чтобы написать все специальные методы (которые могут быть болью).

В противном случае попробуйте это для своего __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 

Как отмечает Мартийн, это работает только для классов старого стиля. См. Его ответ для метода, который работает с классами нового стиля.

  • Python IndentationError: слишком много уровней отступа
  • переводить url с помощью google translate из скрипта python
  • заменить текст из списка словаря python
  • Является ли это pythonic для функции, чтобы возвращать цепочки значений / задавать переменные на себе?
  • Перезапись символов из файла в Python
  • Что такое эквивалент Python статических переменных внутри функции?
  • Ошибка ​​при использовании python os.rename
  • как определить, является ли переменная python функцией?
  • Python - лучший язык программирования в мире.