Ped*_*ira 42 python sqlalchemy pylint python-3.x flask-sqlalchemy
我有一个使用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)
Jun*_*Jun 31
pip install pylint-flask
加载已安装的插件.
例如,如果您使用VS代码,请编辑setting.json文件,如下所示:
"python.linting.pylintArgs": ["--load-plugins", "pylint-flask"]
可选的
如果有其他警告,请generated-members
在pylintrc
文件中定义剩余成员
0rk*_*kan 17
您声明为继承的任何类在代码运行之前db.Model
都不会有query
成员,因此Pylint无法检测到它.
除了忽视对每一个无成员的错误造成这种情况的解决方法query
调用是添加query
了对generated-members
在pylint的配置文件列表,因为它只会在运行时创建的成员.
运行Pylint时,它将搜索其文档中所述的配置文件:
您可以使用--rcfile选项在命令行上指定配置文件.否则,Pylint按以下顺序搜索配置文件,并使用它找到的第一个:
pylintrc
在当前的工作目录中- 如果当前工作目录位于Python模块中,Pylint将搜索Python模块的层次结构,直到找到pylintrc文件.这允许您逐个模块地指定编码标准.当然,如果目录包含
__init__.py
文件,则该目录被判断为Python模块- 由环境变量命名的文件
PYLINTRC
- 如果你有一个不是的主目录
/root
:
.pylintrc
在您的主目录中.config/pylintrc
在您的主目录中/etc/pylintrc
因此,如果您没有配置,并且您想要一个系统范围的pylint默认配置,您可以使用pylint --generate-rcfile > /etc/pylintrc
.这将根据您可以根据您的首选项编辑的当前配置(或默认值,如果您没有)生成注释配置文件.
ps:generated-members
在配置文件上是处理此警告的正确方法,正如评论配置所说的那样
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed. Python regular
# expressions are accepted.
Run Code Online (Sandbox Code Playgroud)
小智 15
我在使用flask_sqlalchemy时遇到了同样的问题.我的解决方案是:
pylint --generate-rcfile>~/.config/pylintrc
Run Code Online (Sandbox Code Playgroud)
然后找到
ignored-modules
Run Code Online (Sandbox Code Playgroud)
行,重写为:
ignored-modules=flask_sqlalchemy
Run Code Online (Sandbox Code Playgroud)
所有E1101错误都消失了.
记得阅读评论:
# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
Run Code Online (Sandbox Code Playgroud)
小智 9
对我flake8
有用的是切换到python linter。以下是步骤:
Ctrl+shift+P
(适用于 Windows 用户)Python:Select Linter
. 您将看到所有 Linter 的列表并选择 flake8。--load-plugins pylint-flask
--load-plugins
需要导入的python 包的名称。如果你这样做,你可以在命令行上检查这个(会得到导入错误)。VS Code 中的 Pylinting 更令人讨厌,因为您不会得到任何可见的错误。相反,即使您的代码有一些 linting 问题,您的 linting 错误也将为零。pylint-flask是一个很好的插件,但它甚至不是为了解决这个问题!您可以自己查看源代码。没有提到 Flask-SQLAlchemy;它仅用于解决 Flask 的问题(误报)。
该pylint的瓶-SQLAlchemy的 创建来解决与瓶-SQLAlchemy中的pylint的误报。安装后
pip install pylint-flask-sqlalchemy
Run Code Online (Sandbox Code Playgroud)
应该加上1
# NOT: "pylint-flask-sqlalchemy"
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy"]
Run Code Online (Sandbox Code Playgroud)
1仅直接适用于VS Code。对于其他 IDE 或命令行,请按相同顺序使用相同的参数。
如果一起使用,出于某种原因
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask", "pylint_flask_sqlalchemy"]
Run Code Online (Sandbox Code Playgroud)
不会工作,但
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy", "pylint_flask"]
Run Code Online (Sandbox Code Playgroud)
做。因此,想必,pylint-flask 必须在pylint-flask-sqlalchemy之后加载。
使用 pylint 插件 pylint-flask-sqlalchemy
pip install pylint_flask_sqlalchemy
Run Code Online (Sandbox Code Playgroud)
在你的 VisualCode 的 settings.json 中
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalcheny"]
Run Code Online (Sandbox Code Playgroud)
小智 6
这是joeforker的一个版本的答案,它在lint-time 动态地将Session
对象的所有公共方法添加回一个scoped_session
本地,而不是硬编码一些众所周知的方法名.
定义{path}/{to}/pylintplugins.py
:
import sys
from astroid import MANAGER, scoped_nodes
from astroid.builder import AstroidBuilder
from sqlalchemy.orm import Session
def register(_linter):
pass
def transform(cls):
if cls.name == 'scoped_session':
builder = AstroidBuilder(MANAGER)
module_node = builder.module_build(sys.modules[Session.__module__])
session_cls_node = [
c for c in module_node.get_children()
if getattr(c, "type", None) == "class" and c.name == Session.__name__
][0]
for prop in Session.public_methods:
cls.locals[prop] = [
c for c in session_cls_node.get_children()
if getattr(c, "type", None) == "method" and c.name == prop
]
MANAGER.register_transform(scoped_nodes.Class, transform)
Run Code Online (Sandbox Code Playgroud)
在您的.pylintrc
文件中:
load-plugins={path}.{to}.pylintplugins
Run Code Online (Sandbox Code Playgroud)
在尝试了许多这些选项,插件并添加了查询和所有之后。消除那些scoped_session错误的唯一解决方案是使用:
pylint --generate-rcfile > pylintrc
pylint
再次在您的模块上运行。小智 6
在此页面的第一个解决方案中,需要更新以下内容。这是一个错字问题,
而不是"pylint_flask"
在这个settings.json参数中(在这一行中: "python.linting.pylintArgs": ["--load-plugins", "pylint_flask"])
它应该是"python.linting.pylintArgs": ["--load-plugins", "pylint-flask"])
。
经过大量调查后,我无法让 Pylint 理解这个成员,所以我只是添加query
到generated-members
列表中,检查被忽略。
这不是一个完美的解决方案,但它确实有效。
归档时间: |
|
查看次数: |
25557 次 |
最近记录: |