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

Ody*_*eas 7 python logging pylint flask

使用flask的app.logger成员函数(例如app.logger.error)会导致pylint报告E1101no-member)错误,即使这些成员app.logger是在运行时定义的也是如此。

可以使用以下文件来复制此文件:

app.py

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'
Run Code Online (Sandbox Code Playgroud)

requirements.txt

pylint==2.1.0
Flask==1.0.2
Run Code Online (Sandbox Code Playgroud)

使用virtualenv以下命令重现问题的示例命令:

(此处使用的是Python 3.5,但问题并不特定于该版本)

virtualenv --python=python3.5 env
source env/bin/activate
pip install pip==18.0
pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

最后,运行pylint

pylint -E app
Run Code Online (Sandbox Code Playgroud)

返回以下错误:

************* 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)
Run Code Online (Sandbox Code Playgroud)

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

Yan*_*ong 5

使用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'
Run Code Online (Sandbox Code Playgroud)


Ody*_*eas 3

通过 pylint 插件防止这些误报的解决方案:

pylintplugins.py

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)
Run Code Online (Sandbox Code Playgroud)

此解决方法可防止app.logger.debugapp.logger.infoapp.logger.warningapp.logger.error上的 linting 错误app.logger.addHandler

为了使用,需要使用命令行选项加载pylintplugins.py--load-plugins文件:

PYTHONPATH="." pylint -E app --load-plugins pylintplugins
Run Code Online (Sandbox Code Playgroud)

或者通过在配置文件中包含以下行pylintrc

load-plugins=pylintplugins
Run Code Online (Sandbox Code Playgroud)