rcr*_*ick 137 python django static-analysis pylint
我非常希望将pylint集成到我的python项目的构建过程中,但是我遇到了一个show-stopper:我觉得非常有用的一种错误类型 - : - E1101: *%s %r has no %r
member*在使用常见的django字段时会报告错误, 例如:
E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
Run Code Online (Sandbox Code Playgroud)
这是由这段代码引起的:
def get_user_tags(username):
"""
Gets all the tags that username has used.
Returns a query set.
"""
return Tag.objects.filter( ## This line triggers the error.
tagownership__users__username__exact=username).distinct()
# Here is the Tag class, models.Model is provided by Django:
class Tag(models.Model):
"""
Model for user-defined strings that help categorize Events on
on a per-user basis.
"""
name = models.CharField(max_length=500, null=False, unique=True)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
如何调整Pylint以正确考虑对象等字段?(我也查看了Django源码,我一直无法找到它的实现objects,所以我怀疑它不是"只是"一个类字段.另一方面,我对python很新,所以我很可能忽略了一些东西.)
编辑:我发现告诉pylint没有警告这些警告的唯一方法是阻止所有类型的错误(E1101)这是不可接受的解决方案,因为(在我看来)这是一个非常有用的错误.如果有另一种方式,没有增加pylint源,请指出具体信息:)
见这里对于我已经受够了问题的总结pychecker和pyflakes-他们已经被证明是远远不稳定的一般用途.(在pychecker的情况下,崩溃起源于pychecker代码 - 而不是源代码正在加载/调用.)
Tal*_*iss 146
不要通过添加ignores或禁用或削弱Pylint功能generated-members.
使用一个了解 Django 的积极开发的Pylint插件.
这个Django的Pylint插件运行得很好:
pip install pylint-django
Run Code Online (Sandbox Code Playgroud)
当运行pylint时,在命令中添加以下标志:
--load-plugins pylint_django
Run Code Online (Sandbox Code Playgroud)
详细博客文章在这里.
小智 63
我使用以下内容: pylint --generated-members=objects
sim*_*mon 30
我的〜/ .pylintrc包含
[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id
Run Code Online (Sandbox Code Playgroud)
最后两个是专门为Django.
请注意,PyLint 0.21.1中存在一个错误,需要修补才能使其正常工作.
编辑:经过多次讨论之后,我决定稍微破解PyLint以允许我将上述内容扩展为:
[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set
Run Code Online (Sandbox Code Playgroud)
我简单地说:
import re
for pattern in self.config.generated_members:
if re.match(pattern, node.attrname):
return
Run Code Online (Sandbox Code Playgroud)
在错误报告中提到的修复之后(即,在第129行).
快乐的时光!
Thi*_*cao 23
如果您使用Visual Studio代码,请执行以下操作:
pip install pylint-django
并添加到VSC配置:
"python.linting.pylintArgs": [
"--load-plugins=pylint_django"
],
Run Code Online (Sandbox Code Playgroud)
gur*_*lex 19
django-lint是一个很好的工具,用django特定设置包装pylint:http://chris-lamb.co.uk/projects/django-lint/
github项目:https://github.com/lamby/django-lint
Tho*_*ers 16
由于pylint如何工作(它检查源本身,而不让Python实际执行它),因此pylint很难弄清楚元类和复杂基类实际上如何影响类及其实例.在"pychecker"工具在这方面好一点,因为它不会真正让Python的执行代码; 它导入模块并检查生成的对象.但是,这种方法还有其他问题,因为它实际上让Python执行代码:-)
你可以扩展pylint来教它关于Django使用的魔法,或者让它更好地理解元类或复杂的基类,或者在检测到一个或多个它不太明白的特性之后忽略这些情况.我认为这不会特别容易.您也可以通过源代码,命令行选项或.pylintrc文件中的特殊注释告诉pylint不要警告这些事情.
我辞职了使用pylint/pychecker而不是使用带有Django代码的pyflakes - 它只是尝试导入模块并报告它找到的任何问题,例如未使用的导入或未初始化的本地名称.
这不是解决方案,但您可以在objects = models.Manager()不改变任何行为的情况下添加到Django模型中.
我自己只使用pyflakes,主要是由于我的pylint和懒惰的一些哑默认(不想查找如何更改默认值).
尝试运行pylint
pylint --ignored-classes=Tags
Run Code Online (Sandbox Code Playgroud)
如果可以的话,添加所有其他Django类 - 可能使用脚本,比如python:P
文档--ignore-classes是:
--ignored-classes=<members names>
不应检查成员属性的类名列表(对于具有动态设置属性的类很有用).[当前:%默认]
我应该补充一点,在我看来,这不是一个特别优雅的解决方案,但它应该有效.
| 归档时间: |
|
| 查看次数: |
41642 次 |
| 最近记录: |