关于python:如果列表中存在变量,则从自身删除变量的Pythonic方法

Pythonic way to delete variable from self if it exists in a list

我有一个字符串列表['foo1'、'foo2'、…]代表变量,如果变量是自身的一部分,我想从自身中删除它们。做这件事的方法是什么?

我的第一次尝试是

1
2
3
4
5
if hasattr(self, 'foo1'):
    del self.foo1
if hasattr(self, 'foo2'):
    del self.foo2
...

但对于一个大的列表来说,这显然是不可扩展的。

有人能帮忙吗?


您可以使用for循环,同时通过在对象的__dict__上使用pop来提高性能:

1
2
for attr in ('foo1','foo2'):
    self.__dict__.pop(attr,None)

pop基本上检查元素是否在字典中,如果在字典中,则将其删除(它还返回相应的值,但此处不相关)。这里我们还使用None作为"默认"返回值,这样,如果键不存在,pop就不会出错。


您可以使用delattr。如果属性不存在,它将引发一个AttributeError,因此如果需要,可以用方法包装它:

1
2
3
def safe_delattr(self, attrname):
    if hasattr(self, attrname):
        delattr(self, attrname)

或者使用try/except块:

1
2
3
4
try:
    delattr(self, attrname)
except AttributeError:
    pass

这样做的好处是,使用定义__slots__的类,因为它们不公开__dict__属性。


你可以很容易地做到这一点,但我不得不说,乍一看这似乎是一个非常奇怪的要求。通常在Python中,任何涉及动态创建和/或删除变量的事情都是代码味道,所以我对需求是如何出现的(以及您的描述是否可能掩盖了真正的问题)感兴趣。

但是记住实例变量存储在self.__dict__中,并且假设您的字符串列表称为los,您可以使用类似的方法来执行您想要的操作。

1
2
3
for s in los:
    if s in self.__dict__:
        del self.__dict__[s]


也许是这样?

1
2
3
def del_attr(self, list):
    for l in list:
        delattr(self, l)

有delattr(),尽管我想不出很多情况下删除对象的属性是有用的。


循环运行?

1
2
3
var_names = ["foo1","foo2","foo3"]
for var_name in var_names:
    delattr(self, var_name)