如何在python中强制使用标量类型

如何在python中强制使用标量类型,python,numpy,types,casting,scalar,Python,Numpy,Types,Casting,Scalar,我想定义一个变量,并让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 这种行为正是我

我想定义一个变量,并让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位内存

这已被标记为的副本,但我对类型并不感到困惑,我希望标量的行为类似于uint8,而无需为每个操作明确地强制转换它,我想知道这是否可能。我宁愿不必键入:

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

这是一个冗长且容易出错的过程,如果我能定义类型(或者类似于类型的东西,请不要在这里被类型这个词的误用弄糊涂了,我只想在不过度键入或强制转换的情况下实现所需的行为)然后继续编写我的模拟器。

在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

可以通过Numpy索引数组标量的功能实现这一点:

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

它给出了数组(255,dtype=uint8)的输出

可能与Thank fjarri重复,但我对类型并不感到困惑。我试图在操纵标量时获得一种特殊的行为,并希望这是可能的,而无需过多的键入或强制转换。这就是设计选择
numpy
中提到的家伙们所做的。您看到自己获得了数组所需的行为,但不是标量。至于构造<代码> Foo= -1 ,在完成这个任务时,不可能让Python考虑当前的<代码> FoO < /代码>(除非你正在做一些AST魔术)。code>foo将被类型为
int
的文本
-1
覆盖,无论发生什么情况。