什么是“pythonic”方法来创建一个包含一个元素的列表,或者只是保持它为空?

2024-03-28 22:56:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设一个havePerson实例personperson可能有一个属性id。你知道吗

我想写一个函数,当属性为None或缺少时,得到一个空列表[];当属性为id时,得到一个列表[12, ]。你知道吗

def get_id_list(person):
    try:
        return [getattr(person, 'id'), ]
    except AttributeError:
        return []

这是完美的作品,但有没有一个“pythonic”的方式做这件事没有尝试除了块,也许在一行?你知道吗


Tags: 实例函数noneid列表getreturn属性
3条回答

您可以使用^{}检查属性:

def get_id_list(person):
    if hasattr(person, 'id'):
        return [person.id]  # better then getattr(person, 'id')
    else:
        return []

可以写在一行中:

def get_id_list(person):
    return [person.id] if hasattr(person, 'id') else []

我会选择

def get_id_list(person):
    _id = getattr(person, 'id', None)
    return [] if _id is None else [_id]

但是,最好确保总是定义属性,这样就不必将getattr与默认值一起使用,也不必使用hasattr检查是否存在。你知道吗

你的方法是Python,只是做一些调整。你知道吗

首先,不要返回try块内部。可以在变量中保留id值,并在else子句中正确返回它。原因是您正在执行多个操作,比如获取属性和转换为列表(在其他情况下可能还有更多操作),而您只是在捕获AttributeError。当您使用else时,您可以很容易地处理其他异常,而且从编码风格的角度来看,它更优雅。你知道吗

其次,您不需要使用getattr在这种情况下,您可以简单地使用直接属性访问。你知道吗

另外,与使用try-except相反,您可能希望检查对象是否具有该属性,然后返回其值,但由于请求原谅比获得许可更容易。原则上try-exepct更好。你知道吗

def get_id_list(person):
    try:
        id = person.id
    except AttributeError:
        return []
    else:
        return [id]

相关问题 更多 >