使用自定义属性类时如何避免pylint不可迭代

时间:2017-02-05 00:09:56

标签: python pylint

我的代码使用cached_property中常用的werkzeug类。请考虑以下代码段:

from werkzeug import cached_property

class SampleClass(object):
    @cached_property
    def list_prop(self):
        return [1, 2]

sample = SampleClass()
for item in sample.list_prop:
    print item

我在CI过程中使用pylint。如果我运行pylint not-an-iterable检查此代码,即使代码完全正常,它也会失败。

$ pylint --disable=all --enable=not-an-iterable prop.py
************* Module prop
E:  9,12: Non-iterable value sample.list_prop is used in an iterating context (not-an-iterable)
使用内置@property装饰器代替@cached_property检查相同代码时,pylint效果很好:

class SampleClass(object):
    @property
    def list_prop(self):
        return [1, 2]

我该怎么做才能帮助pylint克服这种误报?

2 个答案:

答案 0 :(得分:2)

您似乎错误地导入了cached_property。它住在werkzeug.utilspylint发现了这个错误:E: 1, 0: No name 'cached_property' in module 'werkzeug' (no-name-in-module)。这是固定代码:

from werkzeug.utils import cached_property

class SampleClass(object):
    @cached_property
    def list_prop(self):
        return [1, 2]

sample = SampleClass()
for item in sample.list_prop:
    print item

在应用此修复程序后运行pylint时,它会停止抱怨:

$ pylint test
No config file found, using default configuration
************* Module test
C:  1, 0: Missing module docstring (missing-docstring)
C:  3, 0: Missing class docstring (missing-docstring)
C:  5, 4: Missing method docstring (missing-docstring)
R:  3, 0: Too few public methods (1/2) (too-few-public-methods)
C:  8, 0: Invalid constant name "sample" (invalid-name)

答案 1 :(得分:0)

当我使用Django + pylint时,我面临相同的问题: 代码如下:

queryset = A.objects.filter(col_a='a',col_b='b')

它将显示错误消息:

Non-iterable value queryset is used in an iterating context (not-an-iterable)

我的解决方法如下( + all()):

queryset = A.objects.filter(col_a='a',col_b='b').all()

它实际上解决了我的问题,我知道它似乎与问题没有太大关系,但我将Google搜索为“ pylint + Non-iterable”,此页面将位于搜索结果的顶部,因此我想将解决方案放在此处,谢谢