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

时间:2017-02-17 17:06:30

标签: python attributes del

我有一个字符串列表[' foo1',' foo2',...],它们代表我想要从self中删除的变量,如果它们是self的一部分。什么是Pythonic和紧凑的方法呢?

我的第一次尝试是

if hasattr(self, 'foo1'):
    del self.foo1
if hasattr(self, 'foo2'):
    del self.foo2
...

但对于大型列表而言,这显然不具备可扩展性。

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:10)

您可以在对象的for上使用pop,同时使用__dict__循环提升效果

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

pop基本上检查元素是否在字典中,如果是这种情况则删除它(它也返回相应的值,但这里不相关)。我们在这里使用None作为"默认"返回值,如果密钥不存在,pop将不会出错。

答案 1 :(得分:5)

您可以使用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__属性。

答案 2 :(得分:2)

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

但请记住,实例变量存储在class SayHello(object): def print_args(self, arg1, arg2): print (arg1, arg2) if __name__ == "__main__": foo = SayHello() foo.print_args(sys.argv[1], sys.argv[2]) 中,并假设您的字符串列表被称为self.__dict__,您可以使用此类内容执行您想要的操作

los

答案 3 :(得分:1)

或许这样的事情?

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

答案 4 :(得分:0)

循环运行吗?

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

答案 5 :(得分:0)

delattr(),虽然我无法想到删除对象属性很有用的很多情况。