当我使用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。
答案 0 :(得分:2)
Pylint
无法知道json.loads
的结果类型是dict
,因为它取决于输入字符串。通常情况下,像getattr,setattr等动态代码在可预测的短时间内不能被足够深地反省,因此被猜测,而不是内省。