Python: 'self' 无法订阅
Python: 'self' is unsubscriptable
我有一个带有多个字典变量的 class。有没有办法设置 class 变量的字典参数,其中变量名在函数中作为字符串传递?
<?php
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
## self.var_name.value = value ### pylint: Instance of 'Test' has no 'var_name' member
self[var_name]["value"] = value ### pylint: 'self' is unsubscriptable ###
instance = Test()
instance.set_variable("var1", 150)
在编码 linter 时抛出错误说明:“'self' 是不可订阅的”。如果我执行代码,我会收到错误消息:“TypeError: 'Test' object is not subscriptable”。
解决此问题的一种方法是使用 'getattr':
创建一个临时变量
def set_variable(self, var_name, value):
temp = getattr(self, var_name)
temp["value"] = value
setattr(self, var_name, temp)
但是,我发现上面的解决方案增加了内存使用量,尤其是对于更大的词典。
此外,我想在很多地方使用 self[var_name]。有办法吗?
setattr(self, var_name, temp)
不需要,因为您正在修改原始词典(您只是暂时将其命名为 temp
)。这里它本质上是一个空操作(你正在设置你读过的字典的相同地址)。所以内存使用量很小,不依赖于你的词典有多大。
所以您接近的解决方案是:
def set_variable(self, var_name, value):
getattr(self, var_name)["value"] = value
你可以使用 self.__dict__[var_name]
做你想做的事。
虽然 Python 类 是使用字典实现的,但您不能将它们视为开箱即用的字典。
self[var_name]
应该是 getattr(self, var_name)
.
如果您坚持使用 [ ]
语法 Test
应该执行 __getitem__
:
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
self[var_name]["value"] = value
# or getattr(self, var_name)["value"] = value if not implementing __getitem__
def __getitem__(self, item):
return getattr(self, item)
instance = Test()
instance.set_variable("var1", 150)
print(instance.var1)
# {'value': 150}
我有一个带有多个字典变量的 class。有没有办法设置 class 变量的字典参数,其中变量名在函数中作为字符串传递?
<?php
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
## self.var_name.value = value ### pylint: Instance of 'Test' has no 'var_name' member
self[var_name]["value"] = value ### pylint: 'self' is unsubscriptable ###
instance = Test()
instance.set_variable("var1", 150)
在编码 linter 时抛出错误说明:“'self' 是不可订阅的”。如果我执行代码,我会收到错误消息:“TypeError: 'Test' object is not subscriptable”。
解决此问题的一种方法是使用 'getattr':
创建一个临时变量 def set_variable(self, var_name, value):
temp = getattr(self, var_name)
temp["value"] = value
setattr(self, var_name, temp)
但是,我发现上面的解决方案增加了内存使用量,尤其是对于更大的词典。
此外,我想在很多地方使用 self[var_name]。有办法吗?
setattr(self, var_name, temp)
不需要,因为您正在修改原始词典(您只是暂时将其命名为 temp
)。这里它本质上是一个空操作(你正在设置你读过的字典的相同地址)。所以内存使用量很小,不依赖于你的词典有多大。
所以您接近的解决方案是:
def set_variable(self, var_name, value):
getattr(self, var_name)["value"] = value
你可以使用 self.__dict__[var_name]
做你想做的事。
虽然 Python 类 是使用字典实现的,但您不能将它们视为开箱即用的字典。
self[var_name]
应该是 getattr(self, var_name)
.
如果您坚持使用 [ ]
语法 Test
应该执行 __getitem__
:
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
self[var_name]["value"] = value
# or getattr(self, var_name)["value"] = value if not implementing __getitem__
def __getitem__(self, item):
return getattr(self, item)
instance = Test()
instance.set_variable("var1", 150)
print(instance.var1)
# {'value': 150}