有像Clojure的插件那样的python函数吗?

时间:2018-08-20 11:16:10

标签: python clojure

在Python中是否有与Clojure的get-in函数等效的东西?它以某种数据结构在给定的路径上获取数据。

在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

此函数用于访问嵌套数据结构中的任意数据点,这些路径在编译时是未知的,它们是动态的。 clojuredocs上有get-in的更多用法示例。

3 个答案:

答案 0 :(得分:2)

不,但是您可以制作一个

def get_in(d, keys):
   if not keys:
       return d
   return get_in(d[keys[0]], keys[1:])

答案 1 :(得分:1)

您可以写:

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

这将安全地获取您所需的值或None,而不会引发异常-就像Clojure的get-in一样。

如果您需要专用功能,可以编写:

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:])

答案 2 :(得分:0)

一个简单的for循环应该可以解决您的问题-

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