RPython: возможно ли указать / применить тип для переменной?
Я использую os.read() для чтения двоичного содержимого файлов в список. PyPy, похоже, определил, что все элементы списка будут иметь тип int. Можно ли было бы явно аннотировать переменную так, чтобы все элементы считались типом uint64?
Редактировать:
# Converts 8 characters into a 64 bit unsigned integer
def b64(b):
v = 0
for i in range(8):
v |= ord(b[8-1-i])<<(i*8)
return v
# The file consists of 64-bit values
# The first value is the length of the file
# Then follow exactly that number of 64-bit values
# The latter are stored in a list, and returned from the function
def unpack(data):
l = b64(data)
result = []
offset = 8
for i in range(l):
value = b64(data[offset:offset+8])
assert value >= 0
result.append(value)
offset += 8
return result
f = os.open(argv[1], os.O_RDONLY)
data = os.read(f, 2**32)
os.close(f)
unpacked = unpack(data)
Результатом, возвращаемым из unpack(), должен быть список 64-битных значений без знака, но сейчас кажется, что они являются 32-битными значениями со знаком. Я пытался использовать assert, но безрезультатно.
Мне нужно что-то вроде result = SomeList<UInt64>
или похожие. Позже я преобразую этот список в список из списка UInt64 и должен обеспечить его (семантика моей виртуальной машины зависит от этого).
1 ответ
Простые числа Python в RPython превращаются в знаковые значения из N битов, где N = 32 или 64 в зависимости от размера указателя:
http://rpython.readthedocs.io/en/latest/rpython.html
Если вам нужно что-то за пределами этого диапазона, используйте r_uint
или варианты как r_uint64
,