from ctypes import c_byte
from enum import Enum
from sys import getsizeof
def change_enum_value(old: object, new: object) -> None:
"""
Assigns contents of new object to old object.
The size of new and old objection should be identical.
Args:
old (Any): Any object
new (Any): Any object
Raises:
ValueError: Size of objects don't match
Faults:
Segfault: OOB write on destination
"""
src_s, des_s = getsizeof(new), getsizeof(old)
if src_s != des_s:
raise ValueError("Size of new and old objects don't match")
src_arr = (c_byte * src_s).from_address(id(new))
des_arr = (c_byte * des_s).from_address(id(old))
for index in range(len(des_arr)):
des_arr[index] = src_arr[index]
class Number(Enum):
number = "1"
change_enum_value(Number.number.value, "2")
print(Number.number.value) # 2
4条答案
按热度按时间b4lqfgs41#
作者注解:这是个糟糕的主意。
让我们从python中删除字符串
"1"
,并将其替换为"2"
你不再有
"1"
了,毫不夸张地说。这确实有点让人担心...
ua4mk5z42#
当使用枚举时,您的
number = "1"
被视为枚举项之一。因此,首先,它被认为是这样使用的,例如:
顺便说一句,当访问
Number.number
时,您访问的是“enumitem”,它不仅仅是值,实际上,该项有一个名称(number
)和一个值("1"
)。因此,从理论上讲,更改值的好方法应该是:
但是,在任何was中,Enum都是不可变的,所以无论如何你都不能这么做。
vsaztqbk3#
从概念上讲,枚举是一种为“常量”给予“更好的名称”,然后在代码中使用更好的名称而不是使用常量的方法。
Python通过将枚举成员设置为“函数常量”来实现这个目的......参见Python Enum Documentation。
与枚举关联的名称与变量不同。
因此,您无法更改名称的值。
fjnneemd4#
如果您阅读了枚举文档:属性Number.number等是枚举成员(或成员),并且是函数常量.