我正在尝试从提供多个序列的字典(“数据”)中提取数据:
例如,股权提取如下:
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函数?
希望这很清楚!非常感谢您的帮助-非常感谢! :)
最大
答案 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。)