如何在python中强制标量的类型

问题描述 投票:0回答:2

我想定义一个变量并让python尊重所有操作的变量类型。例如,numpy数组强制所有操作的元素类型,因此会发生以下情况:

>> import numpy as np
>> foo = np.array([0], dtype=np.uint8)
>> foo[0] = 255
>> foo[0]
255
>> foo[0] += 1
>> foo[0]
0
>> foo[0] = -3
253

这个行为正是我想要的,但对于标量值,我不必为每个操作创建一个包含1个元素的数组并索引到该数组中。我也不想在每次操作上都抛出值。

这就是我要的:

>> foo = np.uint8(0)
>> foo = 257
>> foo
1
>> foo = -1
255

这可能吗?

解决原因:我正在编写硬件仿真器,需要模拟固定大小的存储器/寄存器(8位)的行为,并希望对这些变量进行操作,并使它们像真正的8位存储器一样工作

这已被标记为Python: confusion between types and dtypes的副本,但我并没有对类型感到困惑,我希望标量表现得像uint8而没有明确地为每个操作投射它,我想知道这是否可行。我宁愿避免输入:

>> foo = np.uint8(value)
>> foo = np.uint8(foo + number)
>> foo += np.uint8(number)

这很乏味且容易出错,如果我可以定义类型(或类似于类型的东西,请不要因为在这里滥用单词类型而感到困惑,我只是对实现所需的行为感兴趣)没有过多的打字或铸造)并继续写我的模拟器。

python numpy types casting scalar
2个回答
0
投票

在Python中,您无法声明变量的类型。变量foo没有类型。它可以有一个值,该值有一个类型(或类)。对象有类型,变量没有。

>> foo = np.uint8(0)   # gives foo one value
>> foo = 257   # gives it another, unrelated value, of type 'int'
>> foo     # doesn't work this way
1
>> foo = -1   # another integer
255

您可以定义具有此类行为的类,例如:

class Uint8(object):
    def __init__(self, value):
        self.value = value % 256
foo = Uint8(0)
foo = Uint8(257)
foo = Uint8(-1)

你的numpy例子有效,因为numpy定义了uint8类型。像foo[0] = 257这样的表达式会修改现有变量。他们没有为foo分配新值。对可变和不可变对象的审查可能会有所帮助。列表,字典和数组是可变的;字符串,元组和整数是不可变的。

>> foo = np.array([0], dtype=np.uint8)
>> foo[0] = 255
>> foo[0]
255
>> foo[0] += 1

0
投票

您可以通过Numpy的索引数组标量功能来实现此目的:

foo = np.array(0, dtype=np.uint8)  # or np.zeros((), dtype=np.uint8)
foo[()] = -1
foo

这给出了array(255, dtype=uint8)的输出。

© www.soinside.com 2019 - 2024. All rights reserved.