【问题标题】:Error message "python-pylint 'C0103:Invalid constant name"错误消息“python-pylint 'C0103:无效的常量名”
【发布时间】:2016-12-18 02:27:53
【问题描述】:

我对这张照片中的错误感到困惑:

我不知道如何解决它们。我的程序是 Python-Flask 网络框架。当我使用 Visual Studio Code 调试我的程序时,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()

【问题讨论】:

    标签: python pylint


    【解决方案1】:

    正如 Kundor 所解释的,PEP 8 指出:

    常量通常在模块级别定义,并以全部大写字母书写,并用下划线分隔单词。

    关键是 Python 中的“常量”实际上并不存在。根据 PEP 8,Pylint 期望模块级变量是“常量”。

    话虽如此,您有多种选择:

    • 你不想要这个“恒定”的东西,然后将 Pylint 的 const-rgx 正则表达式更改为与例如variable-rgx,

    • 您可以使用# pylint: disable=invalid-name 禁用此文件的警告,甚至在本地文件中,

    • 通过将它们包装到函数中来避免模块级变量。

    在你的情况下,我会选择第三个选项,通过创建一个 build_app 函数或类似的东西。这将返回应用程序(也许还有“db”对象,但你有几个选择)。然后你可以添加第二个选项的盐来得到类似的东西:

    app = build_app() # pylint: disable=invalid-name

    【讨论】:

    • “根据 PEP 8,Pylint 期望模块级变量是‘常量’。”AFAICT PEP 8 说所有模块级变量都是常量。反过来说:常量是模块级变量。
    • -1 PEP 8(来自您的链接):Constants are usually defined on a module level and written in all capital letters with underscores separating words. @Alec 是对的。这并不是说不要使用模块(非常量)变量。那将是愚蠢的。我也不同意你混淆代码的建议,只是为了避免像 Pylint 这样的静态代码检查器存在本质上的缺陷。
    【解决方案2】:

    PEP 8 仅考虑模块级别的常量这一事实可能是许多开发人员使用专用 main() 函数的原因。

    所以你可以这样解决你的问题:

    def main():
        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)
        db.create_all()
        app.run()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • IMO 这可能不是经常出现的原因,如果有的话。
    【解决方案3】:

    PEP 8 规定常量名称should be in all caps

    因此,将这些变量重命名为全部大写。

    提示:如果您在 Google 上搜索“C0103”,它将带您访问 Pylint 消息 wiki entry for that message,并提供详细信息。

    【讨论】:

      【解决方案4】:

      将这些变量重命名为全部大写。

      app = Flask(__name__)      => APP = Flask(__name__)
      bootstrap = Bootstrap(app) => BOOTSTRAP = Bootstrap(app)
      

      【讨论】:

        【解决方案5】:

        您可以在 Python 脚本的开头使用以下行并执行它:

        # pylint: disable=invalid-name
        

        它将禁用静态代码分析器中所有无效的常量约定消息。

        【讨论】:

        • 你能在 VS Code Python linter 设置中指定这个吗?
        猜你喜欢
        • 2023-03-26
        • 2016-01-09
        • 2021-11-24
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        相关资源
        最近更新 更多