Flask的“ app.logger”的Pylint假阳性:E1101:方法“ logger”没有“ debug”成员(无成员)

时间:2018-08-03 18:55:13

标签: python logging flask pylint

使用烧瓶的app.logger成员函数(例如app.logger.error)会导致pylint报告E1101no-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

是否有避免这些误报的好方法?

3 个答案:

答案 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.debugapp.logger.infoapp.logger.warningapp.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

  1. 如果您这样导入应用,则会在app.logger.info上出现皮棉错误:

    from myapp import app

  2. 如果您这样导入应用程序,则不会在app.logger.info上出现皮棉错误:

    from flask import current_app as app

来自documentation

  

Flask通过应用程序上下文解决了此问题。您可以使用current_app代理,而不是直接引用应用,该代理指向处理当前活动的应用。

我对为什么没有很好的答案,但是使用pylint==2.2.2上的python3.6.6对我有用。与往常一样,您的里程可能会有所不同。