使用eval不好,但是我还能怎么做呢?

时间:2019-11-16 12:34:41

标签: python eval

我正在用Python为Grafana创建一个json数据源。它将从JIRA中获取信息,并作为Grafana的表格呈现。我希望表的创建是动态的,因此我希望能够动态分配我抓取的字段。我发现到目前为止可行的唯一方法是使用eval() ...

有人可以为我指出更好的解决方案吗?我看过getattrsetattr,但是我不明白如何使用它,或者它没有满足我的需求。

下面的示例仅将其用于priority

priority = 'issue.fields.priority.name'

for issue in self.jira.search_issues(jql, maxResults=False):
    if issue.fields.assignee:
        issuelist.append([issue.key, issue.fields.assignee.displayName, eval(priority)])
    else:
        issuelist.append([issue.key, 'Unassigned', eval(priority)])

1 个答案:

答案 0 :(得分:2)

IIUC,您可以通过以下方式使用getattr

设置

class Priority:

    def __init__(self, name):
        self.name = name


class Fields:

    def __init__(self, priority):
        self.priority = priority

class Issue:

    def __init__(self, fields):
        self.fields = fields

代码

from functools import reduce

priority = 'issue.fields.priority.name'
issue = Issue(Fields(Priority("high")))

print(eval(priority))
print(reduce(getattr, priority.split('.')[1:], issue))

输出

high
high

因此,您可以在代码中进行更改:

issuelist.append([issue.key, 'Unassigned', eval(priority)])

收件人:

issuelist.append([issue.key, 'Unassigned', reduce(getattr, priority.split('.')[1:], issue)])