我们一直是粉丝的忠实粉丝pylint.它的静态分析已成为我们所有python项目的关键部分,并且节省了大量时间来追逐晦涩的错误.但是从1.3 - > 1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误.
之前通过pylint1.3 运行完全清洁的项目现在抱怨几乎每个使用E1101的C扩展成员.我们被迫禁用E1101错误,但这实际上减损了它的用处pylint.
例如,这完全有效地使用了lxml包
r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')
Run Code Online (Sandbox Code Playgroud)
运行此过程pylint,它会报告:
$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E: 3, 6: Module 'lxml.etree' has no 'Element' member (no-member)
Run Code Online (Sandbox Code Playgroud)
但它完全有效:
$ python valid.py
<Element mydoc at 7fddf67b1ba8>
Run Code Online (Sandbox Code Playgroud)
这里真的很奇怪.一小部分C扩展似乎可以正常工作pylint,例如:
r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version
$ pylint -rn valid2.py
No config file …Run Code Online (Sandbox Code Playgroud) 在Python中,如果类的某些方法需要辅助函数,但是辅助函数本身不使用类中的任何东西,我应该将辅助函数放在类的内部还是外部?
我试过把它放在里面,但是PyLint抱怨说这个功能可以放在外面.
@Karl:
该类是软件升级程序,如果该文件夹尚不存在,则辅助函数会创建一个新文件夹.这个类在一个模块中,现在几乎只有类的代码.其他课程可能会在以后添加.
我刚刚尝试用Pylint lint一些代码,最后剩下的错误是
R0902: too-many-instance-attributes (8/7)
Run Code Online (Sandbox Code Playgroud)
我理解限制实例属性数量的基本原理,但有七个看起来有点低.我也意识到短号不应该有最后一个字.但是,我想知道我应该做什么,而不是:
def __init__(self, output_file=None, output_dir=None):
"""
Set the frobnicator up, along with default geometries
"""
self.margin = 30
self.pos = [0, 0]
self.sep = [5, 5]
self.cell = [20, 20]
self.frobbr = library.Frobbr()
page = self.frobbr.get_settings('page')
self.lim = [page.get_width() - self.margin,
page.get_height() - self.margin]
self.filename = output_file
self.moddir = output_dir
Run Code Online (Sandbox Code Playgroud)
我应该将几何包装到一个字典中,做一些其他的事情来阻止Pylint抱怨,或者只是忽略它(我真的不想这样做)?
python instance-variables pylint code-readability code-structure
我想将一个大的Python函数重构为较小的函数.例如,请考虑以下代码段:
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
Run Code Online (Sandbox Code Playgroud)
当然,这是一个微不足道的例子.在实践中,代码更复杂.我的观点是它包含许多必须传递给提取函数的局部范围变量,它们可能如下所示:
def mysum(x1, x2, x3, x4, x5, x6, x7, x8, x9):
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
return x
Run Code Online (Sandbox Code Playgroud)
问题是pylint会触发有关太多参数的警告.做以下事情可以避免警告:
def mysum(d):
x1 = d['x1']
x2 = d['x2']
...
x9 = d['x9']
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 …Run Code Online (Sandbox Code Playgroud) 我有一个使用Flask-SQLAlchemy(v2.0)的Flask(v0.10.1)应用程序,我正在尝试配置Pylint来检查它.使用Python 3.4.2运行.
第一个错误是:
Instance of 'SQLAlchemy' has no 'Table' member (no-member)
Run Code Online (Sandbox Code Playgroud)
我修复了这个,忽略了SQLAlchemy上的成员属性检查:
ignored-classes=SQLAlchemy
Run Code Online (Sandbox Code Playgroud)
但是我对实体上的查询成员有问题:
Class 'UserToken' has no 'query' member (no-member)
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,而不必忽略每个查询调用上的无成员错误?
烧瓶引导:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app = Flask(__name__)
db.init_app(app)
app.run()
Run Code Online (Sandbox Code Playgroud)
UserToken实体:
from app import db
class UserToken(db.Model):
user_token_id = db.Column(db.Integer, primary_key=True, index=True)
token_auth = db.Column(db.String(64), unique=True, nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)
控制器:
from entities import UserToken
token = UserToken.query.filter(
UserToken.token_auth == token_hash,
).first()
Run Code Online (Sandbox Code Playgroud) 我正在使用以下设置
我希望我们能够在visual studio代码中使我的生活变得更轻松,但是,每次导入我都会声明"未解决的导入".即使是默认的django导入(即来自django.db的导入模型).
我认为这是因为它没有看到虚拟环境python文件.
一切都很好,但它开始变得烦人.
我拥有的解释器选项都是python的系统版本.它似乎根本看不到我的虚拟环境python(它与我的工作区不在同一个目录中,因此该部分有意义).
如果我在settings.json文件中设置python.PythonPath,它只是忽略它并且不会将我的虚拟环境路径列为选项.我也尝试在我的全局python设置中进行设置,但它也没有显示出来.
有没有人遇到这个问题并知道快速解决方案让它工作?
谢谢,jAC
最新版本的pylint允许使用人类可读消息ID来抑制消息.例如,而不是
class MyTest(unittest.TestCase): # pylint: disable=R0904
...
Run Code Online (Sandbox Code Playgroud)
你可以指定:
class MyTest(unittest.TestCase): # pylint: disable=too-many-public-methods
...
Run Code Online (Sandbox Code Playgroud)
此页面列出了数字消息ID.但是,我正在寻找消息ID的人类可读版本的完整列表.我在哪里可以找到该列表?
我目前正在尝试实现 Steam 登录网站。但是我无法在代码中传递这个错误。我已经创建了数据库对象,但它一直显示我之前提到的错误。我不确定 SQLAlchemy 是否发生了变化,或者自从我使用它以来发生了什么变化。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
发出的消息pylint是
E1101: Instance of 'SQLAlchemy' has no 'Column' member (no-member)
Run Code Online (Sandbox Code Playgroud) 我对这张照片中的错误感到困惑:
我不知道如何解决它们.我的程序是一个Python-Flask Web框架.当我使用VScode调试程序时,Pylint会显示这些错误.我知道这个问题无关紧要,但这让我很恼火.我该如何解决?
# -*- coding: utf-8 -*-
import sys
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_moment import Moment
#from flask_wtf import Form
#from wtforms import StringField, SubmitField
#from wtforms.validators import Required
from flask_sqlalchemy import SQLAlchemy
reload(sys)
sys.setdefaultencoding('utf-8')
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost:3306/test?'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
bootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
if __name__ == '__main__':
db.create_all()
app.run()
Run Code Online (Sandbox Code Playgroud) 我有
find . -iname "*.py" -exec pylint -E {} ;\
Run Code Online (Sandbox Code Playgroud)
和
FILES=$(find . -iname "*.py")
pylint -E $FILES
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,第一个命令将为每个Python文件运行pylint,第二个命令将为所有文件运行一次pylint.我希望两个命令都会返回相同的输出,但它们会返回不同的结果.我认为这种差异与导入和F(失败)pylint消息有某种关系,这种情况在导入失败时发生,而不是由pylint -E输出.
有人已经经历过这个并且可以解释为什么差异发生以及运行pylint的最佳方式是什么?