清理管理包含函数名称的解析字典的方法

时间:2014-06-09 21:34:10

标签: python dictionary

好直接解释一下,我希望“解析”用户输入。 - 简单的输入字符串 - >输出字符串。

然而,除了简单地根据字典(正则表达式检查)检查输入字符串之外,没有任何“逻辑”方法来解析它。现在这并不困难 - 我只是创建一个带有正则表达式搜索字符串键的字典&正则表达式/函数指针值。

然而问题是:可能会有大约100-200个“键”。我可以很容易地看到自己希望将来添加/删除密钥(可能合并) 那么有没有办法创建这样的字典看起来“结构化”?保持“数据”远离“代码”。 (数据将是正则表达式 - 函数名对)?

2 个答案:

答案 0 :(得分:1)

将字典以JSON格式存储在文件中,函数名称为普通字符串。演示如何加载JSON文件:

样本文件的内容:

{"somestring":"myfunction"}

代码:

import json
d = json.load(open('very_small_dic.txt', 'r'))
print(d) # {'somestring': 'myfunction'}

如何获取字符串:函数映射:

首先从文件中加载字典,如上面的代码所示。之后,您构建一个新的字典,其中函数名称的字符串被实际函数替换。演示:

def myfunction(x):
    return 2*x

d = {'somestring': 'myfunction'} # in the real code this came from json.load
d = {k:globals()[v] for k,v in d.items()}
print(d) # {'somestring': <function myfunction at 0x7f36e69d8c20>}
print(d['somestring'](42)) # 84    

您还可以将您的功能存储在单独的文件myfunctions.py中并使用getattr。这可能比使用globals更简洁。

import myfunctions # for this demo, this module only contains the function myfunction

d = {'somestring': 'myfunction'} # in the real code this came from json.load
d = {k:getattr(myfunctions,v) for k,v in d.items()}
print(d) # {'somestring': <function myfunction at 0x7f36e69d8c20>}
print(d['somestring'](42)) # 84    

答案 1 :(得分:0)

您也可以使用JsonSchema(http://json-schema.org/example1.html)。

我认为为了转换属于某些键的值,您必须编写一个函数来执行转换。

如果您只是想根据某些键的存在来清理输入 - 最好将其转换为字典,定义模式然后检查(必需/可选字段)/根据枚举列表键入或验证字段。