好直接解释一下,我希望“解析”用户输入。 - 简单的输入字符串 - >输出字符串。
然而,除了简单地根据字典(正则表达式检查)检查输入字符串之外,没有任何“逻辑”方法来解析它。现在这并不困难 - 我只是创建一个带有正则表达式搜索字符串键的字典&正则表达式/函数指针值。
然而问题是:可能会有大约100-200个“键”。我可以很容易地看到自己希望将来添加/删除密钥(可能合并) 那么有没有办法创建这样的字典看起来“结构化”?保持“数据”远离“代码”。 (数据将是正则表达式 - 函数名对)?
答案 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)。
我认为为了转换属于某些键的值,您必须编写一个函数来执行转换。
如果您只是想根据某些键的存在来清理输入 - 最好将其转换为字典,定义模式然后检查(必需/可选字段)/根据枚举列表键入或验证字段。