将字符串转换为访问函数以访问字典中的系列

时间:2018-07-12 20:22:55

标签: python

我正在尝试从提供多个序列的字典(“数据”)中提取数据:

例如,股权提取如下:

data['Financials']['Balance_Sheet']['equity']

由于我有多个函数,每个函数调用一个不同的序列(例如,股权,债务,商誉等),因此我希望能够通过定义以下字符串来为每个函数定义“访问权限”为:

Goodwill -> data['Financials']['Balance_Sheet']['Goodwill']
Equity->data['Financials']['Balance_Sheet']['Equity']

我的想法是做这样的事情:

Data_pulled= ACCESS('data['Financials']['Balance_Sheet']['Goodwill']')

将字符串转换为访问函数需要什么ACCESS函数?

希望这很清楚!非常感谢您的帮助-非常感谢! :)

最大

1 个答案:

答案 0 :(得分:0)

我质疑您要在这里完成什么。一个更好的答案可能是编写一个访问器函数,该函数可以安全地获取您想要的字段,而不必每次都输入整个内容。 考虑以下代码:

tbl_guid_cost_centre

这称为闭包,您可以在运行时定义函数。在这里,您将创建def ACCESS(*strings): def ACCESS_LAMBDA(dic): result = dic for key in strings: result = result[key] return result return ACCESS_LAMBDA dic = { 'aa': { 'bb': { 'cc': 42 } } } ABC_ACCESS = ACCESS('aa','bb','cc') print ABC_ACCESS(dic) ,然后使用pull_goodwill = ACCESS('Financials','Balance_Sheet','Goodwill')

获取值

这不能完全回答您的问题,并且星号参数和Lambda返回函数是非常高级的功能。但是,不要只是“调用Data_pulled = pull_goodwill(data)”,这是一种很不安全的编码习惯。 eval()有其用途...但是,请考虑您要尝试执行的操作,并查看是否存在可以编程以访问所需数据的简单抽象,而不是依赖python解析器来进行从字典中获取值。

编辑: Link to information about closures in python

edit2: 为了不必将字典传递给返回的lambda函数,可以将其传递给函数构造函数。情况如下所示,请注意,eval()的定义更改现在包括ACCESS,并且dic定义现在没有参数。

ACCESS_LAMBDA

(请注意,如果对dict进行了修改,那么ABC_ACCESS值将发生变化。这是因为python通过引用传递,如果想要一个恒定值,则需要复制dic。)