如果变量存在于列表中,则从 self 中删除变量的 Pythonic 方法
Pythonic way to delete variable from self if it exists in a list
我有一个字符串列表 ['foo1'、'foo2'、...],它们表示我想从 self 中删除的变量(如果它们是 self 的一部分)。什么是 Pythonic 和紧凑的方式来做到这一点?
我的第一次尝试是
if hasattr(self, 'foo1'):
del self.foo1
if hasattr(self, 'foo2'):
del self.foo2
...
但这显然无法扩展到大型列表。
有人能帮忙吗?
运行它在循环吗?
var_names = ["foo1", "foo2", "foo3"]
for var_name in var_names:
delattr(self, var_name)
有delattr(),虽然我想不出很多删除对象属性有用的情况。
您可以使用 for
循环,同时通过在对象的 __dict__
上使用 pop
来 提升性能 :
for attr in ('foo1','foo2'):
self.__dict__.pop(attr,None)
pop
基本上检查元素是否在字典中,如果是则将其删除(它也 return 是相应的值,但这与此处无关)。我们在这里也使用 None
作为 "default" return 值,这样如果键不存在,pop
就不会出错。
您可以使用 delattr
。如果该属性不存在,它将引发 AttributeError
,因此您可以根据需要将其包装在一个方法中:
def safe_delattr(self, attrname):
if hasattr(self, attrname):
delattr(self, attrname)
或使用 try/except 块:
try:
delattr(self, attrname)
except AttributeError:
pass
这具有使用定义 __slots__
的 类 的优势,因为它们不公开 __dict__
属性。
也许是这样的?
def del_attr(self, list):
for l in list:
delattr(self, l)
您可以很容易地做到这一点,但我不得不说,乍一看这似乎是一个非常奇怪的要求。通常在 Python 中,任何涉及动态创建 and/or 变量删除的东西都是代码味道,所以我很想知道需求是如何出现的(以及您的描述是否可能掩盖了真正的问题)。
但请记住实例变量存储在 self.__dict__
中,并假设您的字符串列表被称为 los
您可以用这样的方式做您想做的事
for s in los:
if s in self.__dict__:
del self.__dict__[s]
我有一个字符串列表 ['foo1'、'foo2'、...],它们表示我想从 self 中删除的变量(如果它们是 self 的一部分)。什么是 Pythonic 和紧凑的方式来做到这一点?
我的第一次尝试是
if hasattr(self, 'foo1'):
del self.foo1
if hasattr(self, 'foo2'):
del self.foo2
...
但这显然无法扩展到大型列表。
有人能帮忙吗?
运行它在循环吗?
var_names = ["foo1", "foo2", "foo3"]
for var_name in var_names:
delattr(self, var_name)
有delattr(),虽然我想不出很多删除对象属性有用的情况。
您可以使用 for
循环,同时通过在对象的 __dict__
上使用 pop
来 提升性能 :
for attr in ('foo1','foo2'):
self.__dict__.pop(attr,None)
pop
基本上检查元素是否在字典中,如果是则将其删除(它也 return 是相应的值,但这与此处无关)。我们在这里也使用 None
作为 "default" return 值,这样如果键不存在,pop
就不会出错。
您可以使用 delattr
。如果该属性不存在,它将引发 AttributeError
,因此您可以根据需要将其包装在一个方法中:
def safe_delattr(self, attrname):
if hasattr(self, attrname):
delattr(self, attrname)
或使用 try/except 块:
try:
delattr(self, attrname)
except AttributeError:
pass
这具有使用定义 __slots__
的 类 的优势,因为它们不公开 __dict__
属性。
也许是这样的?
def del_attr(self, list):
for l in list:
delattr(self, l)
您可以很容易地做到这一点,但我不得不说,乍一看这似乎是一个非常奇怪的要求。通常在 Python 中,任何涉及动态创建 and/or 变量删除的东西都是代码味道,所以我很想知道需求是如何出现的(以及您的描述是否可能掩盖了真正的问题)。
但请记住实例变量存储在 self.__dict__
中,并假设您的字符串列表被称为 los
您可以用这样的方式做您想做的事
for s in los:
if s in self.__dict__:
del self.__dict__[s]