我想定义一个变量并让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中,您无法声明变量的类型。变量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
这给出了array(255, dtype=uint8)
的输出。