Есть ли что-то эквивалентное функции входа 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.
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:])
Простой цикл должен решить вашу проблему -
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
Нет, но вы, безусловно, можете сделать один
def get_in(d, keys):
if not keys:
return d
return get_in(d[keys[0]], keys[1:])
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.