Есть ли что-то эквивалентное функции входа Clojure в Python? Он получает данные по заданному пути в некоторой структуре данных.

В Clojure он используется как:

(def employee
  {:name "John"
   :details {:email "info@domain.com"
             :phone "555-144-300"}})

(get-in employee [:details :email])  ; => "info@domain.com"

Если перевести на синтаксис Python, он будет использоваться следующим образом:

dictionary = {'a': {'b': 10}}
get_in(dictionary, ['a', 'b'])  # => 10

Эта функция используется для доступа к произвольным точкам данных в вложенных структурах данных, где пути неизвестны во время компиляции, они являются динамическими. Дополнительные примеры использования get-in можно найти на clojuredocs.

0
Rovanion 20 Авг 2018 в 14:16

3 ответа

Лучший ответ

Ты можешь написать:

dictionary.get('details', {}).get('email')

Это безопасно получит нужное вам значение или None, не выбрасывая исключение, как это делает get-in Clojure.

Если вам нужна выделенная функция для этого, вы можете написать:

def get_in(d, keys):
    if not keys:
        return d
    elif len(keys) == 1:
        return d.get(keys[0])
    else:
        return get_in(d.get(keys[0], {}), keys[1:])
1
Aleph Aleph 20 Авг 2018 в 11:26

Простой цикл должен решить вашу проблему -

x = {'a':{'b':{'c': 1}}}

def get_element(elements, dictionary):
    for i in elements:
        try:
            dictionary = dictionary[i]
        except KeyError:
            return False
    return dictionary

print(get_element(['a', 'b', 'c'], x))
# 1
print(get_element(['a', 'z', 'c'], x))
# False
0
Sushant 20 Авг 2018 в 12:07

Нет, но вы, безусловно, можете сделать один

def get_in(d, keys):
   if not keys:
       return d
   return get_in(d[keys[0]], keys[1:])
2
FHTMitchell 20 Авг 2018 в 11:26
51929592