Создать словарь выбранных функций

У меня есть 20K объектов и набор функций, представленных в списке. Мне нужно извлечь эти функции из каждого объекта и сохранить их в словарь. Каждый объект имеет почти 100 функций.

Например:

# object1
Object1.Age = '20'
Object1.Gender = 'Female'
Object1.DOB = '03/05/1997'
Object1.Weight = '130lb'
Object1.Height = '5.5'

#object2
Object1.Age = '22'
Object1.Gender = 'Male'
Object1.DOB = '03/05/1995'
Object1.Weight = '145lb'
Object1.Height = '5.8'

#object3
Object1.Age = '22'
Object1.Gender = 'Male'
Object1.DOB = '03/05/1995'
Object1.Weight = '145lb'

#object4
...

И список функций, которые мне нужно извлечь из каждого объекта (этот список может измениться, поэтому мне нужно, чтобы код был гибким в этом отношении):

features = ['Gender', 
        'DOB', 
        'Height']

В настоящее время я использую эту функцию, чтобы захватить все функции, которые мне нужны для каждого объекта:

def get_features(obj, features):
return {f: getattr(obj, f) for f in features}

Эта функция отлично работает, если все объекты имеют все функции, которые я хочу. Но есть некоторые объекты, которые не имеют всех функций. Например, object3 не имеет поля с именем "Высота". Как я могу поместить NaN для значения отсутствующих файлов в моем словаре, чтобы я мог предотвратить ошибку?

3 ответа

Решение

Документация Python getattr:

getattr (object, name [, default]) Возвращает значение именованного атрибута объекта. имя должно быть строкой. Если строка является именем одного из атрибутов объекта, результатом является значение этого атрибута. Например, getattr(x, 'foobar') эквивалентен x.foobar. Если названный атрибут не существует, возвращается значение по умолчанию, если оно предоставлено, в противном случае вызывается AttributeError.

Вы можете просто сделать это:

def get_features(obj, features):
    return {f: getattr(obj, f, float('Nan')) for f in features}

Это должно вернуться NaN в качестве значения по умолчанию, если ключ отсутствует: obj.__dict__.get(feature_name, float('NaN'))

Для Python 3.5+, NaN доступен как константа в math пакет, так что это будет работать obj.__dict__.get(feature_name, math.nan)

Ты можешь использовать obj.__dict__:

def get_features(obj, features):
  return {f:obj.__dict__.get(f, 'NaN') for f in features}

Или, если вы все еще хотите использовать getattrВы можете реализовать hasattr:

def get_features(obj, features):
  return {f:'NaN' if not hasattr(obj, f) else getattr(obj, f) for f in features}
Другие вопросы по тегам