如果对象不为None,则获取Python属性

25

是否有一种Python方式可以在一行代码中获取属性,如果对象存在?当前在下面的代码中,如果有人传递一个None类型的对象,则代码将会中断,因此我需要一些干净的方法来检查它不是None,但在一行代码中。C#有?.语法非常好用,所以正在寻找类似的东西。

class MyClass:
    def __init__():
        self.my_property = "Hello, World!"

def print_class_property(myClassInstance):
    print(myClassInstance???.my_property) # Here is where I need something inline

1
为什么只用一行?仅仅因为简洁并不意味着更好。无论如何,你可以使用 getattr - Christian Dean
如果有人将None传递给你的print_class_property,那是他们的错误,而不是你的错误。话虽如此,Python没有空值合并运算符或类似的东西。 - user2357112
1
@CamJohnson26,请看我的回答。 - Christian Dean
@CamJohnson26 getattr有一个default参数。通常在Python中,您可能只需使用try: ... except AttributeError。这被认为是Pythonic的。 - juanpa.arrivillaga
3
为什么不用 b = a.attr if a is not None else 'some default value' - khachik
显示剩余4条评论
1个回答

44
你可以使用内置函数getattr。它允许一个可选的第三个参数,如果传入的对象没有指定的属性,则该参数将被返回。来自官方文档:

getattr(object, name[, default])

返回对象object的命名属性的值。name必须是一个字符串。如果字符串是对象属性中的一个名称,则结果是该属性的值。例如,getattr(x,'foobar')等同于x.foobar如果不存在所需的属性,则会返回提供的default。否则,将引发AttributeError。

加粗部分为强调内容。

>>> getattr(None, 'attr', 'default')
'default'

这里有一个更贴近于你的问题的例子:

>>> class Class:
    def __init__(self):
        self.attr = 'attr'

        
>>> def func(obj):
    return getattr(obj, 'attr', 'default')

>>> func(Class())
'attr'
>>> func(None)
'default'

正如 @juanpa.arrivillaga 在评论中所说,处理这种情况时另一个常见的习语是使用 try/except。请参阅Python中的EAFP原则是什么?


1
这对我非常有帮助,谢谢。你知道为什么第三个参数没有记录吗? - CamJohnson26
1
@ChristianDean:这些是方括号。尖括号是 <> - user2357112
1
@user2357112,这就是我的意思。感谢您的纠正。 - Christian Dean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接