RPython: возможно ли указать / применить тип для переменной? - PullRequest
0 голосов
/ 12 мая 2018

Я использую os.read () для чтения двоичного содержимого файла в список. PyPy, похоже, определил, что все элементы списка будут иметь тип int. Можно ли было бы явно аннотировать переменную так, чтобы все элементы рассматривались как имеющие тип uint64?

Edit:

# 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 Ответ

0 голосов
/ 13 мая 2018

Простые числа Python в RPython превращаются в знаковые значения N битов, где N = 32 или 64 в зависимости от размера указателя:

http://rpython.readthedocs.io/en/latest/rpython.html#integer-types

Если вам нужно что-то внев этом диапазоне используйте r_uint или такие варианты, как r_uint64.

...