pylint报告通过simplejson加载的数据可能没有成员错误

时间:2014-02-04 06:25:35

标签: python pylint simplejson

当我使用pylint运行以下代码块时,我没有错误。

import json
for key, value in json.loads('{"foo":"bar"}').items():
    print(key, value)

使用json切换simplejson然后运行pylint后,我收到错误消息:

Instance of 'bool' has no 'items' member (but some types could not be inferred) (maybe-no-member)

通过比较astroid对于simplejson.loads&的感染结果。 json.loads - 即使在json和amp; simplejson是用c_speedups编译的,astroid在处理simplejson库时选择scan_once函数的python版本,在处理json库时选择c版本。

import astroid.builder
builder = astroid.builder.AstroidBuilder()
ast = builder.string_build("""
import simplejson
import json
x = json.loads('"test"')
y = simplejson.loads('"test"')
""")

json_assignment, simplejson_assignment = list(ast.get_children())[2:]
print "json:", list(json_assignment.get_children())[-1].infered()
print "simplejson:", list(simplejson_assignment.get_children())[-1].infered()

运行上面的代码输出:

json: [YES]
simplejson: [YES, <Const(NoneType) l.97 [simplejson.scanner] at Ox102720290>, <Const(bool) l.99 [simplejson.scanner] at Ox1027207d0>, <Const(bool) l.101 [simplejson.scanner] at Ox102720d10>]

在推断astroid&amp;的返回类型时,我不确定simplejson.loads为什么会有不同的行为? json.loads - 但上述情况意味着json库的方案可能会意外地超过pylint。

1 个答案:

答案 0 :(得分:2)

Pylint无法知道json.loads的结果类型是dict,因为它取决于输入字符串。通常情况下,像getattr,setattr等动态代码在可预测的短时间内不能被足够深地反省,因此被猜测,而不是内省。