Это имеет преимущество в работе с любым количеством элементов:
def getfirstattr(obj, *attrs):
return next((getattr(obj, attr) for attr in attrs
if hasattr(obj, attr)), None)
У этого есть незначительный недостаток very , который выполняет два поиска по окончательному значению: один раз чтобы убедиться, что атрибут существует, другой для фактического получения значения. Этого можно избежать, используя выражение вложенного генератора:
def getfirstattr(obj, *attrs):
return next((val for val in (getattr(obj, attr, None) for attr in attrs)
if val is not None), None)
Но я действительно не чувствую, что это большое дело. Выражение генератора, вероятно, будет быстрее, чем простой старый цикл даже с двойным поиском.