阅读json时替代eval

时间:2018-03-13 12:37:51

标签: python json python-3.x function class

我有一个类来解析来自某些在线词典的数据,它从json读取有关单词的信息,然后按照json告诉的方式执行方法。 json的一个例子:

{
"functions": [
    {
        "name": "find_translations",
        "properties": {
            "only_first": false
        }
    },
    {
        "name": "find_synonyms",
        "properties": {
             "number": 5
        }
],
"word": "to exuberate",
"language": "angielski",
"target_language": "polski",
"collection": "default"
}

所以,我有一个方法有find_translations和find_synonyms。并且__init __正在读取json,我想用json中的参数执行函数。 我可以做一堆ifs,但我认为它不具备可扩展性。我可以做eval(),但这是一个漏洞。我该怎么办?我可以创建类似带功能的字典吗?

编辑:

这是我的课程(简化):

class Parser:
  def __init__(self, path):
    ...
    # reads data from json
    ...

    # my problem: I need to launch methods from this class
    # that were mentioned in json. In case from example, I'd launch
    self.find_translations(self)
    self.find_synonyms(self)
    # it is an example, so without parameters


def find_translations(self):
    # do something

def find_synonyms(self):
    # do something

def find_usage(self):
    # do something

2 个答案:

答案 0 :(得分:2)

使用ast.literal_eval作为eval的更安全的替代方案:

来自documentation

  

ast.literal_eval:安全地评估表达式节点或字符串   包含Python文字或容器显示。字符串或节点   提供的可能只包含以下Python文字结构:   字符串,字节,数字,元组,列表,dicts,集合,布尔值和   None

     

这可以用于安全地评估包含Python的字符串   来自不受信任来源的值,无需解析值   自己。它无法评估任意复杂性   表达式,例如涉及运算符或索引。

答案 1 :(得分:2)

您可以使用getattr函数来调用类的特定方法: -

getattr(Parser, function_name_here)(arguments_here)

我认为这就是你要求的?我希望它有所帮助。