Ali*_*fee 5 python pylint simplejson
当我用pylint运行以下代码块时,我没有错误.
import json
for key, value in json.loads('{"foo":"bar"}').items():
print(key, value)
Run Code Online (Sandbox Code Playgroud)
当切换出json有simplejson,然后运行pylint的,我得到的错误:
Instance of 'bool' has no 'items' member (but some types could not be inferred) (maybe-no-member)
Run Code Online (Sandbox Code Playgroud)
从比较astroidsimplejson.loads和json.loads的推测结果看来,即使json和simplejson都是用c_speedups编译的,astroid 在处理库时会选择scan_once函数的python版本simplejson,而c处理json库时的版本.
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()
Run Code Online (Sandbox Code Playgroud)
运行上面的代码输出:
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>]
Run Code Online (Sandbox Code Playgroud)
我不确定为什么astroid在推断simplejson.loads&的返回类型时会有不同的行为json.loads- 但是上面暗示了带有json库的场景可能会意外地超过pylint.
Pylint无法知道json.loadswill 的结果类型是dict,因为它取决于输入字符串。通常,像 getattr、setattr 等动态代码无法在可预测的短时间内进行足够深入的内省,因此是猜测,而不是内省。