使用烧瓶的app.logger
成员函数(例如app.logger.error
)会导致pylint
报告E1101
(no-member
)错误,即使{{ 1}}是在运行时定义的。
可以使用以下文件来复制该文件:
app.py
app.logger
requirements.txt
import flask
app = flask.Flask(__name__)
@app.route('/')
def say_hello():
app.logger.debug('A debug message')
app.logger.error('An error message')
return 'hello'
使用pylint==2.1.0
Flask==1.0.2
的示例示例来再现问题:
(此处使用的是Python 3.5,但问题并不特定于该版本)
virtualenv
最后,运行virtualenv --python=python3.5 env
source env/bin/activate
pip install pip==18.0
pip install -r requirements.txt
:
pylint
返回以下错误:
pylint -E app
是否有避免这些误报的好方法?
答案 0 :(得分:3)
通过pylint插件防止这些误报的解决方案:
pylintplugins.py
************* Module app
app.py:9:4: E1101: Method 'logger' has no 'debug' member (no-member)
app.py:10:4: E1101: Method 'logger' has no 'error' member (no-member)
此解决方法可防止在import sys
from astroid import MANAGER, scoped_nodes, extract_node
from astroid.builder import AstroidBuilder
def register(_linter):
pass
def transform(f):
if f.name == 'logger':
for prop in ['debug', 'info', 'warning', 'error', 'addHandler']:
f.instance_attrs[prop] = extract_node('def {name}(arg): return'.format(name=prop))
MANAGER.register_transform(scoped_nodes.FunctionDef, transform)
,app.logger.debug
,app.logger.info
,app.logger.warning
和app.logger.error
上出现掉毛错误。
要使用该文件,需要使用app.logger.addHandler
命令行选项加载 pylintplugins.py 文件:
--load-plugins
,或者在PYTHONPATH="." pylint -E app --load-plugins pylintplugins
配置文件中加入以下行:
pylintrc
答案 1 :(得分:3)
改为使用create_logger
。
from flask import Flask
from flask.logging import create_logger
APP = Flask(__name__)
LOG = create_logger(app)
@APP.route('/')
def say_hello():
LOG.debug('A debug message')
LOG.error('An error message')
return 'hello'
答案 2 :(得分:1)
还请注意,如果要通过另一个python文件(例如使用“蓝图”时的视图文件)导入app
:
如果您这样导入应用,则会在app.logger.info
上出现皮棉错误:
from myapp import app
如果您这样导入应用程序,则不会在app.logger.info
上出现皮棉错误:
from flask import current_app as app
Flask通过应用程序上下文解决了此问题。您可以使用current_app代理,而不是直接引用应用,该代理指向处理当前活动的应用。
我对为什么没有很好的答案,但是使用pylint==2.2.2
上的python3.6.6
对我有用。与往常一样,您的里程可能会有所不同。