【问题标题】:Python Get Property if Object is not None如果 Object 不是 None,Python 获取属性
【发布时间】:2018-02-15 13:39:17
【问题描述】:

如果一个对象存在于一行代码中,有没有一种 Pythonic 的方法来获取一个属性?目前在下面的代码中,如果有人传入 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

【问题讨论】:

  • 为什么是一行?仅仅因为一些简洁的东西并不能使它变得更好。无论如何,你可以使用getattr
  • 如果有人将 None 传递给您的 print_class_property,那是他们的错误,而不是您的错误。也就是说,Python 没有空合并运算符或类似的东西。
  • 因为这些对象是对象列表中的属性,我必须进行大约 20 次检查。我每次都可以做一个空检查,但感觉 Python 应该有一些东西。
  • @CamJohnson26 看我的回答。
  • 为什么不b = a.attr if a is not None else 'some default value'

标签: python python-3.x


【解决方案1】:

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

getattr(object, name[, default])

返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x, 'foobar') 等价于 x.foobar如果命名属性不存在,默认如果提供则返回,否则引发 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 在cmets 中所说,在处理此类案件时,另一个常见的习惯用法是使用try/except。见What is the EAFP principle in Python?

【讨论】:

  • 这对我很有用,谢谢。知道为什么没有记录第三个参数吗?
  • @ChristianDean:这些是方括号。尖括号是<>
  • @user2357112 这就是我的意思。感谢您的正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多